zmodyfikuj makro Excela tak, aby odwoływało się do listy tekstu, a nie do kodu stałego

0

Próbuję uzyskać pomoc w ostatnim kroku makra programu Excel, nad którym pracowałem. Skonfigurowałem makro, które będzie pobierać dane z arkuszy z dwóch różnych skoroszytów i wklejać je do trzeciego skoroszytu.

Trzeci skoroszyt to jeden z 15 plików przypisanych 15 różnym pracownikom, z których każdy jest oznaczony inną nazwą i numerem.

Skonfigurowałem Makro, aby otwierać i aktualizować każdy z 15 skoroszytów pojedynczo, a następnie zapisywać i zamykać je, ale teraz muszę dostosować zmiany do listy 15 (na wypadek, gdy pracownicy odchodzą lub nowi pracownicy zostać zatrudnionym).

Sposób, w jaki napisałem Makro, musiałbym ręcznie wprowadzić kod i zmienić odniesienie do nazwisk i numerów identyfikacyjnych każdego z 15 pracowników.

Czy istnieje sposób, aby skonfigurować go tak, aby mógł odczytać nazwę i numer z listy (zapisanej na czwartym skoroszycie), dzięki czemu mogę po prostu edytować tę listę w razie potrzeby, a makro może pozostać niezmienione i działać w pętli ? Wiem, że mogłem użyć opcji Zastąp za każdym razem, gdy musiałem dokonać zmiany, ale nadal łatwiej byłoby pracować z jednej edytowalnej listy. Dziękuję Ci.

W poniższym przykładzie odwołuje się pracownik o nazwisku Melvin Smith ID # 2878:

‘ Using the AutoFilter on the workbook called NEW DD    
Windows("NEW DD.xlsx").Activate
    ActiveSheet.Range("$H$1:$H$3055").AutoFilter Field:=8, Criteria1:=”=*Melvin Smith*”, _ Operator:=xlAnd
    Selection.Copy
‘ Going back to Melvin’s workbook named 2878    
Windows("2878.xlsx").Activate
    Sheets("D dd N").Select
    Range("A1").Select
    ActiveSheet.Paste
NATHAN ARNOLD
źródło
Wiem, że po prostu powiedzenie „odwiedź tę stronę” jest na ogół złą formą, ale rozwiązanie jest dość podstawowe w kodzie kodowania. Musisz zadeklarować i używać zmiennych do przechowywania nazwisk pracowników i powiązanych numerów. Sugeruję zacząć od linku poniżej, dać kodowi kolejną szansę, a potem wrócić, jeśli nadal masz problemy. excel-pratique.com/en/vba/variables.php
wariant
Jak nazywa się 15 arkuszy kalkulacyjnych? Czy możesz zmienić ich nazwę, aby pasowała do nazwiska / numeru pracownika? Jeśli tak, po otrzymaniu nowego zatrudnienia może on po prostu utworzyć nowy, jeśli nie zostanie znaleziony. W takim przypadku możesz przekazać nazwę lub numer do zmiennej i użyć tej zmiennej do kierowania na WB
Raystafarian

Odpowiedzi:

0

W przeszłości robiłem to dokładnie tak, jak mówisz - przechowuję zmienne w innym arkuszu / książce.

Załóżmy, że tworzysz skoroszyt o nazwie „Employees.xlsx”, który wygląda następująco:

  | A               | B
  |-----------------|--------------------
 1| Employee        | Employee Num
 2| Melvin Smith    | 2878
 3| David Gilmour   | 1908

Następnie tworzysz dwa napisy: jeden, który zapętla się przez twoją tabelę, a drugi, który wykonuje kopiowanie. Podajemy nazwisko i numer pracownika do drugiego napisu podrzędnego, który użyje tych zamiast wartości zapisanych na stałe.

Sub CopyAllSheets()

    ' Store a reference to the workbook
    Dim Wb As Workbook
    Set Wb = Workbooks("Employees.xlsx")

    ' Start at row 2 to ignore the column headers
    Dim Counter As Long
    For Counter = 2 To Wb.Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
        CopySingleSheet Wb.Sheets(1).Range("A" & Counter), Wb.Sheets(1).Range("B" & Counter)
    Next Counter

End Sub

Sub CopySingleSheet(EmpName As String, EmpNumber As String)

    ' Using the AutoFilter on the workbook called NEW DD
    Windows("NEW DD.xlsx").Activate
    ActiveSheet.Range("$H$1:$H$3055").AutoFilter Field:=8, Criteria1:="=*" & EmpName & "*", Operator:=xlAnd
    Selection.Copy
    ' Going back to Melvin’s workbook named 2878
    Windows(EmpNumber & ".xlsx").Activate
    Sheets("D dd N").Select
    Range("A1").Select
    ActiveSheet.Paste

End Sub

Mam nadzieję, że to ma sens

użytkownik184994
źródło
Otrzymuję błąd kompilacji, a debugger informuje mnie, że pierwsza zmienna Counter nie jest zdefiniowana. Czy mógłbyś znać edycję tego? Dziękuję Ci.
NATHAN ARNOLD
Proszę, spróbuj tego. Nie zadeklarowałem Counterzmiennej.
user184994
Dziękuję bardzo! To działało idealnie! Bardzo mile widziane!
NATHAN ARNOLD