2016-06-26 14 views
0

Worksheet screenshotExcel/VBA weiß nicht, wo man anfangen soll

Also habe ich eine einfache Benutzerformular, dass die Menschen können leicht abzumelden Ausrüstung. Ich würde es gerne so machen, wenn etwas in der "Equipment" -Spalte raus ist, wird es in der "In/Out" -Spalte stehen. Aber sonst sagen Sie in. Also, wenn Equipment sagt "Laptop 1" und letzte "Datum & Time" Spalte ist leer, dann würde es neben Laptop 1 in der Spalte "IN/OUT" sagen. Die Ausrüstungsspalte ist Multiselect mit einem "," zwischen Ausrüstungsoptionen.

Ich habe keine Ahnung, wo ich damit anfangen soll. Was ich bis jetzt getan habe, minus das Listenfeld und Dropdown für den Benutzerformulareintrag zu füllen.

Private Sub cmdout_Click() 

Set ws = ThisWorkbook.Worksheets("SignOut") 

Dim sh As Worksheet 
Dim LastRow As Long 

Dim i As Integer 
For i = 0 To equip.ListCount - 1 
If equip.Selected(i) Then 
Msg = Msg & equip.List(i) & ", " 
End If 
Next i 

Msg = Left(Msg, Len(Msg) - 2) 

Dim rngFound As Range 
Dim strFirst As String 
Dim strID As String 
Dim strDay As String 
Dim taken As Integer 

strID = gov.Value 
strDay = "" 

Set rngFound = Columns("C").Find(strID, Cells(Rows.Count, "C"), xlValues, xlWhole) 
If Not rngFound Is Nothing Then 
strFirst = rngFound.Address 
Do 
If LCase(Cells(rngFound.Row, "G").Text) = LCase(strDay) Then 
MsgBox "GOV is still signed out." 
taken = 1 
End If 
Set rngFound = Columns("C").Find(strID, rngFound, xlValues, xlWhole) 
Loop While rngFound.Address <> strFirst 
End If 
If taken = 0 Then 


Application.Worksheets("SignOut").Range("A" & Rows.Count).End(xlUp).Offset(1).Value = Now() 
Application.Worksheets("SignOut").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = techname.Value 
Application.Worksheets("SignOut").Range("C" & Rows.Count).End(xlUp).Offset(1).Value = gov.Value 
Application.Worksheets("SignOut").Range("D" & Rows.Count).End(xlUp).Offset(1).Value = Msg 
Application.Worksheets("SignOut").Range("E" & Rows.Count).End(xlUp).Offset(1).Value = otherequip.Value 




End If 

Set rngFound = Nothing 


End Sub 

Anmelden Form:

Private Sub CommandButton1_Click() 

    Dim rngFound As Range 
    Dim strFirst As String 
    Dim strID As String 
    Dim strDay As String 

    strID = techname1.Value 
    strDay = "" 

    Set rngFound = Columns("B").Find(strID, Cells(Rows.Count, "B"), xlValues, xlWhole) 
    If Not rngFound Is Nothing Then 
     strFirst = rngFound.Address 
     Do 
      Application.Worksheets("SignOut").Cells(rngFound.Row, "G").Value = Now() 
      Set rngFound = Columns("B").Find(strID, rngFound, xlValues, xlWhole) 
     Loop While rngFound.Address <> strFirst 
    End If 

    Set rngFound = Nothing 
End Sub 
+0

Willkommen bei Stack Overflow. SO ist kein Code für mich Website oder eine Lehrseite, es gibt viele Websites, die mit den Grundlagen helfen werden. SO ist ein Ort, an dem die Community mit spezifischen Problemen im bestehenden Code helfen kann. Wenn Sie einen vorhandenen Code haben, fügen Sie ihn bitte in den ursprünglichen Post ein. –

Antwort

3

1) Eine "Form" ist ein spezifischer in VBA konstruieren Codierung. Basierend auf dem, was du gepostet hast, nehme ich an, dass du dich nicht darauf beziehst, sondern stattdessen dieses Blatt als Formular nennst? Wenn nicht, dann poste bitte den VBA-Code, den du ausprobiert hast.

2) Angenommen, die Liste der Geräte befindet sich in der Spalte "Tracker", sollten Sie diese Liste verwenden, um eine Dropdown-Liste in der Ausrüstungsspalte zu füllen, um sicherzustellen, dass sie übereinstimmen. Ich gehe auch davon aus, dass Ihre zusätzliche Ausrüstungsspalte in der Dropdown-Liste nichts enthalten wird und wenn Nutzer 2 verfolgte Elemente auschecken, wird für jedes Element eine Zeileneingabe angezeigt. (Ich würde empfehlen, diese Spalte loszuwerden, wenn Sie Benutzer erhalten, die es missbrauchen)

3) Da Sie gefragt haben, wo ich anfangen soll, gebe ich Ihnen das. Sie werden viel mehr lernen, wenn Sie die genaue Syntax selbst herausfinden. Sie können "Excel VBA X" googlen, wobei X im Grunde jede dieser Zeilen ist.

Pseudocode - (werden nicht ausgeführt, muss mit den tatsächlichen Code ersetzt werden - auch die farbigen Worte ignorieren, sie nichts in Pseudo-Code bedeuten)

Phase 1: 
trigger event on save (event handler is another search term for trigger events) 
Change all equipment values to In 
loop through first date/time column 
IF there is a value in that column and there is not a value in the second date/time column get the name of the equipment from the equipment column 
Find equipment from tracker column change In/Out value on that row to Out 
continue the loop until the next row is blank 

Alternate: 
remove code to check everything in 
add on-edit trigger to equipment column 
add row that was edited to array 
add on-edit trigger to check in date column 
store row number to array 
change loop so it only goes through rows in array 
change if so that if something is checked out but not in, it is set out 
(You will want to do this in case someone selects the wrong thing and then changes it - don't change it to out immediately or you will need logic to realize what was changed to out the previous time and change it back to in.) 
else if something is checked out and has a value in check in date column then set it to in 

Phase 2: 
Implement an actual form that people use to fill in the sheet and check things in and out 
Reuse relevant code from above but eliminate human error on dates and other things 
(I suggest this as phase 2 as you can do this without a form and you will be using less new code. I would definitely use a form myself but it would be better if you wade into the pool instead of diving in. Unless you have coding experience and just need to learn syntax and vocab, then dive away.) 

Es gibt viele andere Dinge, die ich würde tue, wenn dies ein Formular war, das ich gemacht habe, aber das sollte dich in Bezug darauf bringen, wonach du suchen musst, um dieses Projekt aufzubauen. Ich habe versucht, es so einfach wie möglich zu machen, damit es nicht überwältigend ist. Es gibt bessere Möglichkeiten, dies zu tun, aber diese Methoden sollten Sie schnell erfassen und später verbessern können, nachdem Sie mehr gelernt haben. Viel Glück bei Ihrer Ausrüstungsverfolgung!

Edit: nach Code

geschrieben

Ok, mit dem Code, den Sie geschrieben, geht der ganzen Weg an der Spitze vor der Unterleitung und setzte in:

Option Explicit 

Dies wird die VBE verursacht Editor, um Ihnen in einigen Fällen mehr aussagekräftiges Feedback zu geben. Zum Beispiel haben Sie Ihre Set-Linie vor Ihrer Dim-Linie. Ohne Option Explicit, wenn der Editor zu einer Variablen kommt, die nicht mit einer Dim-Anweisung deklariert wurde, wird sie einfach im laufenden Betrieb erstellt und als Variantentyp festgelegt. Das verbraucht zusätzlichen Speicher und bedeutet, dass Tippfehler Variablen im laufenden Betrieb erzeugen. Also, wenn Sie das tun, was Sie hier getan haben, Sie am Ende mit

Dim sh As Worksheet ' your sh variable is your worksheet variable. It never gets used again. 
Set ws = ThisWorkbook.Worksheets("SignOut")' the ws here should likely be sh to match the Dim statement ... or the sh in the Dim should be a ws. Except it doesn't ever get used again either. 

keiner dieser Angelegenheit in diesem Fall, da man sie nicht wiederverwenden, aber wenn Sie hatten Code, der auf die eine oder andere bezog, Sie möchten, dass der Compiler Ihnen mitteilt, dass Sie versuchen, eine Variable zu verwenden, die nicht deklariert wurde, anstatt eine neue zu erstellen.

Im Allgemeinen möchten Sie Ihre Dim-Anweisungen alle an der Spitze der Unter oder Funktion. 1) Es ist einfacher, sie zu finden und zu debuggen oder die Rechtschreibung zu überprüfen. 2) Es stellt sicher, dass alle deklariert sind, bevor das Skript versucht, sie zu referenzieren.

Ihr Code hier füllt die Variablen nicht, bevor sie darauf verweisen. So oft Sie eine Variable haben, müssen Sie sie ausfüllen, bevor Sie etwas damit machen können. Es gibt mehrere Möglichkeiten, Variablen mit Daten aus dem Blatt zu füllen. Wenn Sie sich eher mit Arrays als mit Arrays (oder mit Collections anstelle von Arrays) auskennen, werden Sie mit einer solchen Aufgabe viel leichter haben.

Einige spezifische Linien:

Dim LastRow as Long 'you have this declared but you need to put in code to get the last row, which will be handy for populating variables later in your code. Do this right after declaring variables. Google excel vba find last row. 
For i = 0 To equip.ListCount - 1 ' you need to populate equip before doing this. Lookup excel vba how to copy a range into variable. Then lookup how to loop through range. You can start it at your first line of data and go down to the LastRow to grab them all into the same array (which will basically be a table). 
msg = Left(msg, Len(msg) - 2) 'lookup excel vba string manipulations if this isn't doing what you want 
'these next lines all have <Variable Name>.value which won't work for you. If those variables are supposed to be things that the sheet prompts someone to enter and then they get populated here you can see how to do that here-> http://www.excel-vba-easy.com/vba-userform-excel-vba.html 
Application.Worksheets("SignOut").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = techname.Value 
Application.Worksheets("SignOut").Range("C" & Rows.Count).End(xlUp).Offset(1).Value = gov.Value 
Application.Worksheets("SignOut").Range("D" & Rows.Count).End(xlUp).Offset(1).Value = msg 
Application.Worksheets("SignOut").Range("E" & Rows.Count).End(xlUp).Offset(1).Value = otherequip.Value 

Mit Ihrer Schleife untils wollen Sie sicherstellen, dass Sie mit einer kurzen Schleife testen und immer und immer wieder durch Schritt. Wenn du die Logik falsch machst und endlos endlos loopst, kannst du ganz einfach aufhören durchzugehen und es zu reparieren (oder es reparieren, während du durchgehst, dann stoppst und erneut testest), aber wenn du gerade spielst, dann wird Excel dich einfrieren.

Wenn Sie ein Problem mit einem bestimmten Schritt auftreten, können Sie wahrscheinlich viele vorhandene Dinge auf SO finden. Wenn nicht, posten Sie einen neuen Thread mit den Besonderheiten dieses Schrittes. Dieser Beitrag wird bis dahin um ein paar Seiten gekürzt werden und die Leute werden deine Frage wahrscheinlich nicht sehen, wenn du sie hier eingibst. Außerdem wird es einen eigenen Thread verdienen, da Sie zu diesem Zeitpunkt die "Where to start" -Phase durchlaufen haben.

Viel Glück!

Verwandte Themen