Toon posts:

[excel/VBA] string+iets

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beetje onduidelijke titel maar ik zal even uitleggen waar het over gaat:

Option Explicit
Sub Play_Match(PlayerLeft As String, PlayerRight As String)
Dim i As Integer
If PlayerLeft = "" Or PlayerRight = "" Then Exit Sub
For i = 1 To Worksheets("Game").Shapes.Count
If Not (Worksheets("Game").Shapes(i).Name = "LeftButton" Or Worksheets("Game").Shapes(i).Name = "RightButton") Then
Worksheets("Game").Shapes(i).Visible = False
End If
Next i
ActiveWindow.DisplayVerticalScrollBar = False
ActiveWindow.DisplayHorizontalScrollBar = False
With Worksheets("Game")
.Unprotect
.Shapes("LeftButton").DrawingObject.Text = PlayerLeft & " wins"
.Shapes("RightButton").DrawingObject.Text = PlayerRight & " wins"
.Shapes("Port").Top = (.Range("a1:h17").Height - .Shapes("Port").Height) / 2
.Shapes(PlayerLeft).Top = (.Range("a1:h17").Height - .Shapes(PlayerLeft).Height) / 2
.Shapes(PlayerRight).Top = (.Range("a1:h17").Height - .Shapes(PlayerRight).Height) / 2
.Shapes("Stbd").Top = (.Range("a1:h17").Height - .Shapes("Stbd").Height) / 2
.Shapes("Port").Left = (.Range("a1:h17").Width / 2 - .Shapes("Port").Width) / 2
.Shapes(PlayerLeft).Left = (.Range("a1:h17").Width / 2 - .Shapes(PlayerLeft).Width) / 2
.Shapes(PlayerRight).Left = (.Range("a1:h17").Width / 2 - .Shapes(PlayerRight).Width) / 2 + .Range("a1:h17").Width / 2
.Shapes("Stbd").Left = (.Range("a1:h17").Width / 2 - .Shapes("Stbd").Width) / 2 + .Range("a1:h17").Width / 2
.Shapes("Port").Visible = True
.Shapes(PlayerLeft).Visible = True
.Shapes(PlayerRight).Visible = True
.Shapes("Stbd").Visible = True
.Visible = True
.Select
.Range(.Cells(1, 1), .Cells(17, 8)).Select
ActiveWindow.Zoom = True
.Cells(5, 3).Select
.Protect
End With
End Sub

Het gaat dus om dit stukje code. Met deze code wordt het een en ander op je worksheet getoverd, zo heb ik uitgevonden.

Zowel links als rechts wordt een button te voorschijn getoverd met daarop links de tekst , afhankelijk van de spelers, spelernaamlinks wins, en spelernaamrechts wins. Als je op links of rechts klikt dan wint dus speler links of rechts en gaat door naar de volgende ronde.

Verder wordt er links een vierkant getekent genaamd port, en rechts , dus voor spelerrechts een vierkant getekent genaamd stbd.

Nu het stuk waar mijn vraag over gaat -->

In die vierkanten die ik net noemde die links en rechts getekent worden, komt een afbeelding te staan van spelerlinks en spelerrechts. Hij weet welke afbeelding hij moet laten zien omdat het plaatje heet zoals de speler. Dus als spelernaamlinks = pamela anderson, dan laat hij het plaatje zien genaamd pamela anderson.

Nu mijn vraag : ik wil op een of andere manier de mogelijk hebben om van spelerlinks of spelerrechts meerdere plaatjes te laten zien, dmv bijvoorbeeld klikken op het plaatje zodat hij het volgende plaatje laat zien, of dat het 2e plaatje gelijk onder het 1e plaatje wordt afgebeeld, etc.
Echter mijn probleem is, hoe zorg ik ervoor dat hij dat 2e plaatje linkt aan de spelernaam. Ik dacht zelf zoiets als playerleft + 1, zodat hij een plaatje laat zien bijvoorbeeld pamela anderson1. Ik heb zelf geprobeerd zoiets te maken, maar het lukt me niet.

Ik hoop dat iemand me op weg kan helpen en dat iemand mijn verhaal snapt :)

[ Voor 7% gewijzigd door Verwijderd op 28-09-2005 11:53 ]


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Verwijderd schreef op woensdag 28 september 2005 @ 11:53:
Ik heb zelf geprobeerd zoiets te maken, maar het lukt me niet.
Dit is niet voldoende. Wat heb je geprobeerd? Wat lukte er niet?

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Verwijderd

Topicstarter
Ik heb bijvoorbeeld dit geprobeerd

.Shapes(PlayerLeft + 1).Visible = True er tussen gezet en vervolgens een plaatje genaamd pamela anderson1 ingevoegd, maar dan krijg ik een runtime error 13, type mismatch.

of dit

.Shapes(PlayerLeft(1)).Visible = True maar dan krijg ik een expected array error ..

maw , het lukt me dus niet om ervoor te zorgen dat hij de naam van de speler met iets extra neemt altijd. Dus ongeacht de spelernaam altijd 1 erachter voegt bijvoorbeeld, zodat ik daar een extra plaatje aan kan linken

[ Voor 47% gewijzigd door Verwijderd op 28-09-2005 13:21 ]


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Stop AI Slop

Kun je sowieso een plaatje laden in die shape?

In Visual Basic kan dat dus niet, omdat een shape dat simpelweg niet ondersteunt. Kun je, aangezien je plaatjes erin wilt laden, niet beter een picturebox- of image-control gebruiken?

En dan wat jij wilt, zoiets?

Visual Basic:
1
2
3
4
plaatjesnaam = "bill_gates_"
plaatjesnummer = 0
imgLinks.Picture = LoadPicture(plaatjesnaam & plaatjesnummer & ".jpg")
' Nu laadt ie dus "bill_gates_0.jpg"


En dan:

Visual Basic:
1
2
3
4
5
6
7
Sub LinkerShape_Click()

plaatjesnummer = plaatjesnummer + 1
imgLinks.Picture = LoadPicture(plaatjesnaam & plaatjesnummer & ".jpg")
' Nu laadt ie dus "bill_gates_(1, 2, 3, 4, enz...) .jpg"

End Sub


Ofzo???

[ Voor 9% gewijzigd door CodeCaster op 28-09-2005 14:14 ]

Je moet niet dronken dat ik denken ben.
What seems to be the officer, problem?
Waar is de brand, meester?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dit is geen visual basic maar visual basic for applications. Het gaat ook voornamelijk over de interface met de applicatie (excel in dit geval), niet zozeer over VB zelf, en daarom past je topic beter in Officesuites en -software :)

Oh, en code kun je trouwens beter tussen [rml][ code]...[ /code] of [ code=taal]...[ /code][/rml] zetten.

PW -> OFF

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
okay mijn fout ;)

maar goed, ik heb zoiets geprobeerd codecaster, maar ik heb niet zo heel veel kennis van visual basic for applications..
Ik heb nu het volgende geprobeerd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Option Explicit
Sub Play_Match(PlayerLeft As String, PlayerRight As String)
Dim i As Integer
PlayerLeft2 = PlayerLeft + 1
    If PlayerLeft = "" Or PlayerRight = "" Then Exit Sub
    For i = 1 To Worksheets("Game").Shapes.Count
        If Not (Worksheets("Game").Shapes(i).Name = "LeftButton" Or Worksheets("Game").Shapes(i).Name = "RightButton") Then
            Worksheets("Game").Shapes(i).Visible = False
        End If
    Next i
    ActiveWindow.DisplayVerticalScrollBar = False
    ActiveWindow.DisplayHorizontalScrollBar = False
    With Worksheets("Game")
        .Unprotect
        .Shapes("LeftButton").DrawingObject.Text = PlayerLeft & " wins"
        .Shapes("RightButton").DrawingObject.Text = PlayerRight & " wins"
        .Shapes("Port").Top = (.Range("a1:h17").Height - .Shapes("Port").Height) / 2
        .Shapes(PlayerLeft).Top = (.Range("a1:h17").Height - .Shapes(PlayerLeft).Height) / 2
        .Shapes(PlayerRight).Top = (.Range("a1:h17").Height - .Shapes(PlayerRight).Height) / 2
        .Shapes("Stbd").Top = (.Range("a1:h17").Height - .Shapes("Stbd").Height) / 2
        .Shapes("Port").Left = (.Range("a1:h17").Width / 2 - .Shapes("Port").Width) / 2
        .Shapes(PlayerLeft).Left = (.Range("a1:h17").Width / 2 - .Shapes(PlayerLeft).Width) / 2
        .Shapes(PlayerRight).Left = (.Range("a1:h17").Width / 2 - .Shapes(PlayerRight).Width) / 2 + .Range("a1:h17").Width / 2
        .Shapes("Stbd").Left = (.Range("a1:h17").Width / 2 - .Shapes("Stbd").Width) / 2 + .Range("a1:h17").Width / 2
        .Shapes("Port").Visible = True
        .Shapes(PlayerLeft).Visible = True
        .Shapes(PlayerRight).Visible = True
        .Shapes("Stbd").Visible = True
        .Shapes(PlayrLeft2).Visible = True
        .Visible = True
        .Select
        .Range(.Cells(1, 1), .Cells(17, 8)).Select
        ActiveWindow.Zoom = True
        .Cells(5, 3).Select
        .Protect
    End With
End Sub


Maar zoals je begrijpt werkt dit niet, echter ik hoop dat je nu begrijpt wat ik bedoel. Op deze manier probeer ik 2 plaatjes gelijk te laden op het werkblad, dus niet dmv een klik, dat komt later wel.

Verwijderd

als je uit de werkset besturingselementen het picture-element invoegt in een werkblad, kan je precies zo tewerk gaan zoals Codecaster aangeeft. met shapes zie ik het niet lukken. voor de rest is het gegoochel met de shapesposities me totaal onduidelijk.

Verwijderd

Topicstarter
Ik heb geprobeerd zo'n imagebox te tekenen op het werkblad , maar bij de volgende ronde verdwijnt deze helaas weer.

Vraag me niet waarom sommige dingen zo gemaakt zijn want het programma is niet van mij, maar ik wil het alleen naar mijn wens aanpassen ;)

Ik heb het origineel even geupload , zodat de samenhang misschien wat duidelijker wordt..

www.xs4all.nl/~petrus23/league1.xls

  • onkl
  • Registratie: Oktober 2002
  • Nu online
Ik kijk niet lang genoeg om te snappen wat je met al je shapes aan't uitspoken bent maar als
.Shapes(PlayerLeft).Visible = True
werkt en je hiermee
Verwijderd schreef op woensdag 28 september 2005 @ 13:17:
Ik heb bijvoorbeeld dit geprobeerd

.Shapes(PlayerLeft + 1).Visible = True er tussen gezet en vervolgens een plaatje genaamd pamela anderson1 ingevoegd, maar dan krijg ik een runtime error 13, type mismatch.

of dit

.Shapes(PlayerLeft(1)).Visible = True maar dan krijg ik een expected array error ..

maw , het lukt me dus niet om ervoor te zorgen dat hij de naam van de speler met iets extra neemt altijd. Dus ongeacht de spelernaam altijd 1 erachter voegt bijvoorbeeld, zodat ik daar een extra plaatje aan kan linken
een probleem hebt dan ben je waarschijnlijk geholpen met
.Shapes(PlayerLeft & "1").Visible = True
Maar
.Shapes(PlayerLeft & variabelenaamwaarinjenummerstaat).Visible = True
zou ook helpen.
Let op de aanhalingstekens (alles daartussen is volgens VB een platte tekst, geen variabelenaam)
en de &, dat is zeg maar [kort door de bocht] de + maar dan voor strings (teksten0 [/]
offtopic:
overigens, je kan bij brokken code het best de code tag gebruiken.
Begin: [ code ] of [code=vb ] voor mooiere kleurtjes
Eind: [/code]
en dan zonder die spaties

Verwijderd

haha. nu is het "shapes"-verhaal in 1 klap duidelijk :9 :9~ je wenst gewoon alle plaatjes af te lopen door erop te klikken?
ga in de vbe, maak de sheet game visible, unprotect en kopieer naar een nieuwe werkmap
wanneer je dat gedaan hebt kan je alle "shapes" zichtbaar maken door het volgende in het immediatewindow uit te voeren:
for each sh in activesheet.shapes:sh.visible=true:next
met de volgende macro aan een van de knoppen kan je de plaatjes namekaar tonen (telkens eerst op plaatje klikken en dan knop):
Sub Macro1()
Selection.ShapeRange.ZOrder msoSendToBack
End Sub

Verwijderd

Topicstarter
Kijk, dat was nou wat ik bedoelde,
.Shapes(PlayerLeft & "1").Visible = True werkt uitstekend _/-\o_

Voor zover het 2e plaatje, nu zou het mooi zijn als ik gebruik zou kunnen maken van de 2 shapes die al getekent worden aan het begin, dus voor links port en voor rechts stbd. Standaard zou plaatje 1 zichtbaar zijn en plaatje 2 onzichtbaar. Maar als ik op bijvoorbeeld de auto-form `port' klik, dan wordt plaatje 1 visible = false en plaatje 2.visible = true en zo verder.
Ik heb dus een teller nodig die bij houdt hoe vaak er geklikt is, dus bij 0 kliks plaatje1 zichtbaar, 1 klik plaatje2 zichtbaar etc.

Ik denkt dat die oplossing die codecaster eerder aandroeg hiervoor geschikt zou zijn, echter heb ik het idee dat ik hier het een en ander weer voor moet omgooien , en dat doe ik liever niet gezien mijn kennis.

Ik heb het idee dat dit met een macro op te lossen is, die ervoor zorgt dat bij een klik op de auto-form port een module wordt aangeroepen die het volgende plaatje laat zien, gelinkt aan het aantal kliks.

Zit ik op de goede weg of niet ?

-edit
ik zal de hier bovenstaande oplossing eens proberen :)

[ Voor 5% gewijzigd door Verwijderd op 28-09-2005 17:36 ]


  • onkl
  • Registratie: Oktober 2002
  • Nu online
Nee, hij wil als 'ie twee foto's van hetzelfde bikinimodel heeft de gebruiker laten wisselen tussen de verschillende foto's
Ik denk dat hij daarvoor het beste een on_click kan gebruiken in zijn worksheetpane. En daarin een routine als
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 !!Nepcode
Sub Worksheet_on_Click (Byval Target as range)
If Target = deelvan vakje then
 Dim max as integer
 Dim volgnummer as integer
 volgnummer = 0
 Do while Shapeexists(shapes( naamspeler & volgnummer )) 
' weet iemand hier nog een mooie voor, shapeexist is n.a.w. onzin.?
 volgnummer = volgnummer+1
loop
max = volgnummer-1
 For volgnummer = 0 to max
  if shapes (naamspeler & volgnummer).visible = true then
   shapes (naamspeler & volgnummer).visible =false
   if volgnummer = max then
    shapes(naamspeler).visible = true
   else
    shapes(naamspeler & volgnummer+1).visible=true
   end if
  end if
 next volgnummer
end if

-edit- Bovenstaand was n.a.v. Heretic.
Het idee is dus niet dat je ergens een klikteller bijhoudt, maar dat je na de klik bekijkt of er nog een plaatje na komt en die laat zien. Komt er niets na, laat dan gewoon de eerste in de serie zien.

[ Voor 14% gewijzigd door onkl op 28-09-2005 17:45 ]


Verwijderd

Topicstarter
Maar met deze methode moet ik dus alle plaatjes een naam geven , dus ook de begin plaatjesn, namelijk 0 ?

Werkt het dan nog wel icm met de play_match module, omdat deze uitgaat van een naam zonder nummers in eerste instantie ?

En begrijp ik het goed dat ik bovenstaande code opneem in een nieuwe module, en deze oproep zodra ik klik op bijvoorbeeld linkershape in de worksheet, dmv een macro ?

[ Voor 30% gewijzigd door Verwijderd op 28-09-2005 17:51 ]


  • onkl
  • Registratie: Oktober 2002
  • Nu online
1: Je kan je code ook aanpassen als:
van: if shapes (naamspeler & volgnummer).visible = true then
naar:
if shapes (IIf(volgnummer=0,naamspeler,naamspeler & volgnummer)).visible = true then
etc. Iif is een heel beperkte If then, als het eerste argument klopt, dan het tweede anders het derde.
Dan moet je wel nummeren:
plaatje, plaatje2, plaatje3

2: Als je in je VBE (Visual Basic) bent, zie je in je project explorer (linksboven) je bestand staan, met een tree met je modules en forms. Daar staan je werkbladen ook. Daarin kan je functies en subs specifiek voor je werkblad kwijt. Bovendien kan je hier een macro laten reageren op een on_click event (iemand klikt op je werkblad.
Pagina: 1