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!
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. –