Avatar billede guddo Nybegynder
29. november 2004 - 18:45 Der er 28 kommentarer og
2 løsninger

3 spørgsmål til et lille script.

Jeg har lavet et lille program (i VBA) som kan udregne nogle ture til et online-spil, og har nu 3 spørgsmål:

1) Lige er det 3 InputBoxe der kommer op med en OK, hvorefter den fortsætter til næste. Jeg vil gerne have den i samme box, bare med Linierne under hinanden:

________________
|                |
| spm 1          |
| inputfelt 1    |
|                |
| spm 2          |
| inputfelt 2    |
|                |
| spm 3          |
| inputfelt 3    |
|                |
|            OK |
|________________|

2) Jeg vil gerne have den til at returnere fejl, hvis den indtastede værdi ikke er tal. Altså hvis mand indtaster tegn eller bogstavet, skal der komme en lille MsgBox op hvor der står: "Forkert indtastning i felt nr <nr>, prøv igen!" også med en OK knap. Hvorefter den automatisk går op i det felt med markøren.

3) Så har jeg tænkt lidt på at lave den til en exe fil, så den pr. auto starter op ved et dobbeltklik på filen og kommer dirkete ind til spørgsmålene. Ved ikke om det kan lade sig gøre, men det burde det vel?

Her kommer koden:



Public Sub træningspladser()

' made by [LH]vuffe

Dim novicer As Long
Dim krigere As Long
Dim bygninger As Integer
Dim ture As Double
Dim i As Double
Dim krig As Characters


novicer = InputBox("Hvor mange novicer har du?")

krig:
krigere = InputBox("Hvor mange krigere kan du træne pr. gang lige nu?")
If krigere < 100 Then GoTo krig

bygninger = InputBox("Hvor mange bygninger kan du bygge pr. tur?")


For i = 0 To 500 Step 1

ture = ((novicer * 2) / (3 * bygninger * i + krigere)) + i

If ture > ((novicer * 2) / (3 * bygninger * (i - 1) + krigere)) + (i - 1) Then
If i = 0 Then
i = 1
End If
MsgBox ("Du skal bruge " & (i - 1) & " ture på at bygge træningspladser så du har " & (((krigere - 100) / 3) + (i - 1) * 3) & " i alt")
i = 500

End If
Next


Håber i kan hjælpe :)
Avatar billede guddo Nybegynder
29. november 2004 - 18:46 #1
Ups, tegningen blev lidt skæv :|

Er ikke så vandt til at stille spørgsmål, sry ;)
Avatar billede hy Nybegynder
29. november 2004 - 19:31 #2
Du kan bruge KeyPress

Private Sub txtInd_KeyPress(Index As Integer, KeyAscii As Integer)
'Validere indtastninger
 
Select Case KeyAscii
  Case vbKeyReturn 'enter = tab
  KeyAscii = 0
  SendKeys "{tab}"
  Case vbKeyBack 'slet tilbage
  Case 48 To 57 '0 til 9
  Case Else
  KeyAscii = 0
  MsgBox "Indtast kun tal", vbCritical, "Tænk dig om !!"
  End Select
 
End Sub
Avatar billede guddo Nybegynder
29. november 2004 - 19:44 #3
Jeg har altså ingen anelse om hvad du snakker om der, og hvor det skal indsættes :(
Avatar billede martin_moth Mester
29. november 2004 - 21:00 #4
Lav en form, smid de 3 textfelter på den, og brug ovenstående kode - den forudsætter, at der er en textbox der hedder txtInd
Avatar billede martin_moth Mester
30. november 2004 - 11:00 #5
PS.

Du skriver
  Dim i As Double
men bruger blot variablen 'i' som en tæller. Skriv

  Dim i As Long 'Eller integer

Long og integer er heltal
Real og Double er decimaltal


Og GoTo er hæslig programmering - du kan sagtens undgå at bruge det ved at bruge fx. While
Avatar billede martin_moth Mester
30. november 2004 - 12:57 #6
Og hvad er det for en løkke du laver - ??? Meget mystisk, du slutter med at sætte i=500. Jamen så vil løkken jo ALDRIG komme til at køre emre end 1 gang - og er derfor unødvendig. Så vidt jeg kan se kan din kode skrives om til følgende:


Public Sub træningspladser()
Dim novicer As Long
Dim krigere As Long
Dim bygninger As Integer
Dim ture As Double
Dim krig As Characters

novicer = InputBox("Hvor mange novicer har du?")
Do While krigere<100
  krigere = InputBox("Hvor mange krigere kan du træne pr. gang lige nu (min 100)?")
Wend
bygninger = InputBox("Hvor mange bygninger kan du bygge pr. tur?")

ture = ((novicer * 2) / (3 * bygninger * i + krigere)) + i
If ture > ((novicer * 2) / (3 * bygninger * (i - 1) + krigere)) + (i - 1) Then
  MsgBox ("Du skal bruge " & (i - 1) & " ture på bla bla... " & (((krigere - 100) / 3) + (i - 1) * 3) & " i alt")
End If
Avatar billede martin_moth Mester
30. november 2004 - 12:58 #7
Ups - i ovenstående skulle i jo sorteres fra.

Summa sumarum - din kode ser lidt underlig ud, og du bruger slet ikke løkken til noget, og variablen 'i' er overflødig.

Tilbage til det du spurgte om - se min kommentar 29/11-2004 21:00:23
Avatar billede guddo Nybegynder
01. december 2004 - 00:24 #8
Fint nok med lidt kritik, men det du pastede indeholder enorme fejl - så kan ikke se hvad du mener.
Avatar billede guddo Nybegynder
01. december 2004 - 00:27 #9
Hvis det er sådan her, du mener:

Public Sub træningspladser()

' made by [LH]vuffe

Dim novicer As Long
Dim krigere As Long
Dim bygninger As Integer
Dim ture As Double
Dim krig As Characters


novicer = InputBox("Hvor mange novicer har du?")
While krigere < 100
    krigere = InputBox("Hvor mange krigere kan du træne pr. gang lige nu (min 100)?")
Wend
bygninger = InputBox("Hvor mange bygninger kan du bygge pr. tur?")


ture = ((novicer * 2) / (3 * bygninger * krigere))
If ture > ((novicer * 2) / (3 * bygninger * (-1) + krigere)) + (-1) Then
    MsgBox ("Du skal bruge " & (-1) & " ture på at bygge træningspladser så du har " & (((krigere - 100) / 3) + (-1) * 3) & " i alt")

End If
End Sub


Så virker det ikke..
Avatar billede martin_moth Mester
01. december 2004 - 07:20 #10
Jeg ved ikek om det virker eller ej - jeg skrev bare din kode om, så du kan se hvad jeg mener. Har ikke testet den. Men jeg kan ikke se at den skulle give fejl (hvilke?)

Men jeg kan se, at du dimmer en variabel 'i' som du bruger som tæller i en løkke - og den løkke vil ALDRIG køre mere end 1 gang, og er derfor overflødig. Kan du ikke se det - 'i' bliver sat til 500, og så dropper du ud af løkken med det samme. Desuden dimmer du variablen i som en double, den bør være long eller integer

Tilbage til dit oprindelige spørgsmål: Brug svaret fra hy, eller stil supplerende spørgsmål
Avatar billede guddo Nybegynder
01. december 2004 - 11:49 #11
Som jeg skrev, fatter jeg ikke hvor det skal sættes ind.
Avatar billede martin_moth Mester
01. december 2004 - 12:28 #12
Og som jeg skrev, læs min kommentar 29/11-2004 21:00:23
Avatar billede guddo Nybegynder
02. december 2004 - 19:49 #13
Er lidt i tvivl nu; Er du lam eller er du bare arrogant?

Uddyb dog dit svar så jeg forstår det?
Avatar billede martin_moth Mester
03. december 2004 - 10:06 #14
Inden jeg kommer med min reaktion på ovenstående skal du lige have en chance til:

Hvis du bruger 2 minutter på faktisk at læse hvad jeg skriver, så står det MED AL TYDELIGHED hvad du skal. Hvad er det du ikke forstår?
Det nytter ikke meget at bare skrive at du ikke fatter noget - for så ved jeg jo ikek hvor vi skal starte.

Ved du ikke hvad en form er?
Eller ved du hvad det er, men ikke hvordan man opretter en?
Ved du ikke hvad en textbox er?

- hvad er det du ikke fatter?
Avatar billede martin_moth Mester
03. december 2004 - 11:51 #15
Da jeg er i mit overbærende hjørne i dag, vil jeg - på trods af at du har svinet mig til efter at jeg har brugt en del tid på at hjælpe dig - hjælpe dig endnu mere:

1. Du skal oprette en form. Kald den "FormInput"
2. På den form skal du oprette 3 textboxe, der hedder Text1, Text2, Text3
3. Derudover skal du oprette en kanp, der hedder Command1
4. I properties ændrer du Caption på Command1 til "OK"
5. I Command1's _Click event skriver du følgende:

  If text1.Text = "" then Exit sub 'Der SKAl stå noget før der kan trykkes OK
  If text2.Text = "" then Exit sub 'Der SKAl stå noget før der kan trykkes OK
  If text3.Text = "" then Exit sub 'Der SKAl stå noget før der kan trykkes OK
  novicer = val(text1.text)
  krigere = val(text2.text)
  bygninger = val(text3.text)
  End

6. I _Keypresse eventen for HVER af de tre tekstboxe skriver du

  Select Case KeyAscii
    Case vbKeyReturn 'enter = tab
      KeyAscii = 0
      SendKeys "{tab}"
    Case vbKeyBack 'slet tilbage
    Case 48 To 57 '0 til 9
    Case Else
      KeyAscii = 0
      MsgBox "Indtast kun tal", vbCritical, "Tænk dig om !!"
  End Select

7. Du fjerner din kode, hvor du henter 'novicer', 'krigere' og 'bygninger' med inputbokse, og erstatter den af følgende kode

  FormInput.Show
 
8. Du ændrer din variabelerklæring af 'krigere', novicer', bygninger' så de er synlige også for koden i FormInput (variable Scope). Evt. kan du erklære dem i et selvstændigt modul som "public"


Herefter kan du pynte din form lidt op, fx. med et par labels der fortæller hvad det egenligt er der skal indtastes i de tre textboxe.


Der er meget baggrundsviden du skal kende for at forstå ovenstående simple kode, og jeg tvivler meget på at du overhovedet ved hvad fx. en Event er. Det tyder din bemærkning "jeg fatter intet" på!
Og da det netop er event-driven programmering du laver, svarer det lidt til at sætte en hamster til at bygge en rumraket. Du er hamsteren. Nu har du fået tegningen over rumskibet, men skal selv stykke den sammen. Hvis du klarer det, er det jo bare fint. Hvis ikke, må du erkende, at du ikke har evnerne til at lave dette meget simple stykke kode.

Sådan er det - når man sviner folk til, der hjælper en - ganske gratis, endda, og uden at kende dig - så får man den samme spand lort tilbage i hovedet.

Skriv endelig hvad du ikke forstår af ovenstående - men skriver du alle punkter 1-8, så tror jeg du skal erkende, at du er ukvalificeret til at lave dette lille simple program!

Dette er et svar, jeg regner naturligvis med at få points - elelrs spørg videre!
Avatar billede guddo Nybegynder
03. december 2004 - 18:41 #16
Jeg ved ikke hvordan man laver en form ;)
Avatar billede martin_moth Mester
03. december 2004 - 20:33 #17
Gå ind i VBA editoren, vælg Insert > Userform
Avatar billede guddo Nybegynder
04. december 2004 - 15:54 #18
Det er der ikke noget der hedder i mit Excel :|

Det er btw dansk..
Avatar billede guddo Nybegynder
04. december 2004 - 15:58 #19
Ahh ;) Hat fundet ud af det nu :P
Avatar billede guddo Nybegynder
04. december 2004 - 16:10 #20
Private Sub Command1_Click()
    If Text1.Text = "" Then Exit Sub 'Der SKAl stå noget før der kan trykkes OK
    If Text2.Text = "" Then Exit Sub 'Der SKAl stå noget før der kan trykkes OK
    If Text3.Text = "" Then Exit Sub 'Der SKAl stå noget før der kan trykkes OK
    novicer = Val(Text1.FormInput.Show)
    krigere = Val(Text2.FormInput.Show)
    bygninger = Val(Text3.FormInput.Show)
    End
End Sub

Private Sub Text1_Click()
  Select Case KeyAscii
    Case vbKeyReturn 'enter = tab
      KeyAscii = 0
      SendKeys "{tab}"
    Case vbKeyBack 'slet tilbage
    Case 48 To 57 '0 til 9
    Case Else
      KeyAscii = 0
      MsgBox "Indtast kun tal", vbCritical, "Tænk dig om !!"
  End Select
End Sub

Private Sub Text2_Click()
  Select Case KeyAscii
    Case vbKeyReturn 'enter = tab
      KeyAscii = 0
      SendKeys "{tab}"
    Case vbKeyBack 'slet tilbage
    Case 48 To 57 '0 til 9
    Case Else
      KeyAscii = 0
      MsgBox "Indtast kun tal", vbCritical, "Tænk dig om !!"
  End Select
End Sub

Private Sub Text3_Click()
  Select Case KeyAscii
    Case vbKeyReturn 'enter = tab
      KeyAscii = 0
      SendKeys "{tab}"
    Case vbKeyBack 'slet tilbage
    Case 48 To 57 '0 til 9
    Case Else
      KeyAscii = 0
      MsgBox "Indtast kun tal", vbCritical, "Tænk dig om !!"
  End Select
End Sub

Private Sub TextBox1_Change()

End Sub

Private Sub TextBox2_Change()

End Sub

Private Sub TextBox3_Change()

End Sub



Der steg jeg af, kunne ikke fatte fra nummer 7.
Avatar billede martin_moth Mester
06. december 2004 - 06:47 #21
Hvad bruger du nu Textbox...._Change til? Slet dem!

Følg punkt nr. 7 - jeg tror ikke jeg kan forklare det bedre!
Derefter erklærer du dine 3 variabler, der skal kunne ses både i formen og i det hovedprogram, som public i et modul.

Over & Out, Martin
Avatar billede guddo Nybegynder
06. december 2004 - 08:42 #22
Private Sub Command1_Click()
    If Text1.Text = "Hvor mange novicer har du?"
    If Text2.Text = "Hvor mange krigere kan du træne pr. gang lige nu?"
    If Text3.Text = "Hvor mange bygninger kan du bygge pr. tur?"
    novicer = Val(Text1.FormInput.Show)
    krigere = Val(Text2.FormInput.Show)
    bygninger = Val(Text3.FormInput.Show)
    End
End Sub

Private Sub Text1_Click()
  Select Case KeyAscii
    Case vbKeyReturn 'enter = tab
      KeyAscii = 0
      SendKeys "{tab}"
    Case vbKeyBack 'slet tilbage
    Case 48 To 57 '0 til 9
    Case Else
      KeyAscii = 0
      MsgBox "Indtast kun tal", vbCritical, "Tænk dig om !!"
  End Select
End Sub

Private Sub Text2_Click()
  Select Case KeyAscii
    Case vbKeyReturn 'enter = tab
      KeyAscii = 0
      SendKeys "{tab}"
    Case vbKeyBack 'slet tilbage
    Case 48 To 57 '0 til 9
    Case Else
      KeyAscii = 0
      MsgBox "Indtast kun tal", vbCritical, "Tænk dig om !!"
  End Select
End Sub

Private Sub Text3_Click()
  Select Case KeyAscii
    Case vbKeyReturn 'enter = tab
      KeyAscii = 0
      SendKeys "{tab}"
    Case vbKeyBack 'slet tilbage
    Case 48 To 57 '0 til 9
    Case Else
      KeyAscii = 0
      MsgBox "Indtast kun tal", vbCritical, "Tænk dig om !!"
  End Select
End Sub

sådan? =)
Avatar billede martin_moth Mester
06. december 2004 - 09:09 #23
Nej

Du har din kode, som du hele tiden har haft, med alle de underligheder som jeg ikek skal blande mig i.

I den kode henter du nogle værdier vha inputboxe - du ved, der hvor du har skrevet inputbox(....

I stedet for at bruge inputboxe gør du som jeg har skrevet i pkt 7, hvorved den form, du netop har lavet bliver vist.
Avatar billede martin_moth Mester
06. december 2004 - 09:10 #24
Hvorfor skriver du Val(Text3.FormInput.Show)?
Avatar billede guddo Nybegynder
06. december 2004 - 17:59 #25
Private Sub Command1_Click()
    If Text1.Text = "Hvor mange novicer har du?"
    If Text2.Text = "Hvor mange krigere kan du træne pr. gang lige nu?"
    If Text3.Text = "Hvor mange bygninger kan du bygge pr. tur?"
    novicer = Val(Text1.Text)
    krigere = Val(Text2.Text)
    bygninger = Val(Text3.Text)
    End
End Sub

Private Sub Text1_Click()
  Select Case KeyAscii
    Case vbKeyReturn 'enter = tab
      KeyAscii = 0
      SendKeys "{tab}"
    Case vbKeyBack 'slet tilbage
    Case 48 To 57 '0 til 9
    Case Else
      KeyAscii = 0
      MsgBox "Indtast kun tal", vbCritical, "Tænk dig om !!"
  End Select
End Sub

Private Sub Text2_Click()
  Select Case KeyAscii
    Case vbKeyReturn 'enter = tab
      KeyAscii = 0
      SendKeys "{tab}"
    Case vbKeyBack 'slet tilbage
    Case 48 To 57 '0 til 9
    Case Else
      KeyAscii = 0
      MsgBox "Indtast kun tal", vbCritical, "Tænk dig om !!"
  End Select
End Sub

Private Sub Text3_Click()
  Select Case KeyAscii
    Case vbKeyReturn 'enter = tab
      KeyAscii = 0
      SendKeys "{tab}"
    Case vbKeyBack 'slet tilbage
    Case 48 To 57 '0 til 9
    Case Else
      KeyAscii = 0
      MsgBox "Indtast kun tal", vbCritical, "Tænk dig om !!"
  End Select
End Sub

Public Sub træningspladser()

' made by [LH]vuffe

Dim novicer As Long
Dim krigere As Long
Dim bygninger As Integer
Dim ture As Double
Dim krig As Characters


novicer = FormInput.Show("Hvor mange novicer har du?")
While krigere < 100
    krigere = FormInput.Show("Hvor mange krigere kan du træne pr. gang lige nu (min 100)?")
Wend
bygninger = FormInput.Show("Hvor mange bygninger kan du bygge pr. tur?")


ture = ((novicer * 2) / (3 * bygninger * krigere))
If ture > ((novicer * 2) / (3 * bygninger * (-1) + krigere)) + (-1) Then
    MsgBox ("Du skal bruge " & (-1) & " ture på at bygge træningspladser så du har " & (((krigere - 100) / 3) + (-1) * 3) & " i alt")

End If
End Sub


Det har jeg nu.
Avatar billede martin_moth Mester
06. december 2004 - 21:21 #26
Nu stopper du!!!

Det er fuldstændigt nonsens det du skriver i command1_click. Hvor får du de idder fra, til at skrive sådan noget?
Når man programmerer, er det ikek bare som at skrive dansk stil - du SKAL overholde den syntaks der er for sproget, ellers virker det ikke!

Det er fuldstændig nonsens at skrive novicer = FormInput.Show("Hvor mange novicer har du?")

Du har ikke forstået noget at det jeg har sagt - gør som jeg meget meget udførligt har skrevet i 8 punkter tidligere - LAD VÆRE med selv at "opfinde" kode.

Du kan f.eks. IKKE bare skrive "if" UDEN at have et "then" også.

Jeg synes du skal sætte dig ned og lære dig selv følgende:

Hvordan erklærer man en variabel - og hvorfor mon? Hvad er de forskellige variabeltyper?

Hvad er en event?

Hvordan konstruerer man en if-then (-else) sætning
Og hviordan laver man en løkke?

Før du forstår ovenstående, som er helt helt basalt, har du ikke en chance for at lave et ordenligt program. Så spar din egen og andres tid, og kik i en tutorial - der er links til mange her på eksperten!

Spørgsmål lukket - du HAR fået svar, det eneste ekstre der er tilbage er at sætte mig ned og skrive programmet for dig ;o)
Avatar billede guddo Nybegynder
08. december 2004 - 08:48 #27
Hvilket tager dig omkring 2 sekunder ;)

Jeg har bare ikke forstået det, og hvis du ikke kan give mig svaret for du bare heller ikke nogen point, as simple as that =]
Avatar billede martin_moth Mester
08. december 2004 - 15:56 #28
Jeg tror ikke du kan forstå det
Behold du bare dine points
Avatar billede martin_moth Mester
08. december 2004 - 15:59 #29
Og læs en tutorail eller en bog før du forstætter...
Avatar billede martin_moth Mester
08. december 2004 - 16:15 #30
PS: og NEJ, det vil tage meget mere, når du er så urutineret som du er.

Det er helt OK ikke at være god til at programmere - derfor har vi eksperten - men det jeg her er vidne til er snarere en stor mangel på den helt helt grundlæggende forståelse - du "opfinder" din egen kode, og når vi er på det niveau, skal vi starte helt forfra med Adam og Eva hvis du skal have noget ud af det.

Og det tager meget mere end 2 min.

Så derfor foreslår jeg nu for 3. gang, at du sætter dig en smule ind i tingene, før du begynder at spørge. Det sparer både din og andres tid.

At du opfører dig som du gør, medvirker til, at jeg ikke gider bruge mere tid på dig. Så stik du dine points op hvor solen aldrig skinner, hvis det er den måde du leger på!

Venligst, Martin
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester