29. november 2004 - 18:45Der 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:
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
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
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
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")
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
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?
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!
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
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.
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
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")
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)
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
Synes godt om
Ny brugerNybegynder
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.