Chcę mieć makro, które:
- Wykryj na stronie („Oryginał”) wartość komórki (E8 $, data)
- Przejdź do innej strony („Transfer”), (nazwa strony jest różna, ale odpowiednia nazwa strony pojawia się w „Oryginale” $ Z $ 1).
- Spójrz w dół do kolumny „Transfer”, która zawiera listę w każdy poniedziałek (zakres dat zaczyna się od A20, tekst powyżej).
- Znajdź poniedziałek przed datą E8 $ (więc dla E8 = 17 sobota, znalazłby się pon. 12)
- Wstaw wiersz BENEATH w ten poniedziałkowy wiersz (czyli przed wierszem z poniedziałkiem 19)
- Skasuj ten wiersz (więc wiersz przechodzi od Pon-12, puste, Pon-19
- Wytnij / Kopiuj z („Original $ E8”) z zakresu A8: H8
- Przejdź do strony „Transfer”
- Wstaw zaznaczenie A8: H8 do wiersza utworzonego na 5.
- Zapętlić i zrobić to samo za E9 $, dopóki wszystkie informacje nie zostaną umieszczone w „Transfer”.
Komórki, które podałem, to właściwe komórki, daty, które właśnie wymyśliłem (i tak różnią się dla każdego konta).
Eric bardzo uprzejmie podał mi zmodyfikowany przeze mnie kod:
Public Sub do_stuff()
Dim date_to_look_for As String
Dim row As Integer
date_to_look_for = Range("'Original'!K8").Value
'^L: This is the cell that you are reading from. Ensure it is the MONDAY formula
row = 20
'^L: This is where the Transfer date values start
Do Until row = Range("'Transfer'!A1").End(xlDown).row + 1 'create our loop.
'Notice that the .end function will find the end of the data in a column
If Range("'Transfer'!A" & row).Value = date_to_look_for Then
'^L: Look for Original (X) Value specified above (make sure it's Monday).
Range("'Transfer'!" & row + 1 & ":" & row + 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'^L: Once
Range("'Transfer'!A" & row + 1 & ":H" & row + 1).Value = Range("'Original'!A8:H8").Value
'^L:This is WHERE it will paste '^L: This is what will copy
Exit Sub 'no sense in running loop more if already found
End If
row = row + 1
Loop
'If code gets here then the date was never found! so tack to end of list
Dim endrow As Integer
endrow = Range("'Transfer'!A1").End(xlDown).row
Range("'Transfer'!A" & endrow & ":H" & endrow).Value =
Range("'Original'!A8:H8").Value
'^L: What is this?
End Sub
(Wiadomości L: są moimi notatkami, gdy opracowałem, co zrobiły poszczególne sekcje - prosimy o poprawienie mnie, jeśli źle zrozumiałem. Inne zielone „notatki są Erica i nie jestem pewien, czy rozumiem te fragmenty. Nie rozumiem Naprawdę muszę to robić, o ile działa, ale jeśli chcesz nauczyć mnie kodowania, nie krępuj się: D)
Mój problem polega teraz na tym, jak zrobić pętlę, aby działała w dół do oryginalnych wartości (w tym przypadku kolumna K, więc idzie do K9, K10 itp. I robi to samo? Czy to może CIĘĆ zamiast KOPIOWAĆ i usunąć z oryginalnego arkusza po przeniesieniu?
Dzięki wszystkim, którzy pomagali, jesteście świetni!
źródło
Odpowiedzi:
To powinno zrobić to, czego szukasz. Skomentowałem kod, abyś mógł dokładnie przeczytać, co się dzieje. Zauważ, że ten kod używa zmiennej typu Range, co oznacza, że zmienne rTransfer i rOriginal odnoszą się do rzeczywistych komórek w arkuszu.
Mam nadzieję że to pomoże! Powodzenia!
źródło
MsgBox ("Can't find the Monday for ") & rOriginal & ". Searching for Value " & dMonday
Oto przykład, który moim zdaniem oddaje to, co próbujesz zrobić w sensie ogólnym. Skonfigurowałem dwie zakładki w moim skoroszycie oznaczone jako Przeniesienie i Oryginał, tak jak Ty. Skonfigurowałem kartę Original, aby wyglądała następująco:
Dane w A, B, C, D tak naprawdę nie mają znaczenia. Mam kolumnę F i G, aby ustalić, która data jest „ostatnim poniedziałkiem”. Można to oczywiście zrobić w jednej komórce, ale podzieliłem ją na części, aby lepiej zrozumieć. W tym przykładzie moja komórka F2 ma wartość = WEEKDAY (A2) -2, ponieważ funkcja WEEKDAY zwraca dzień tygodnia jako liczbę. Mam G2 ustawione na = A2-F2, aby faktycznie pokazywać „datę ostatniego poniedziałku”.
Mój arkusz przelewu wygląda następująco:
Od tego momentu musimy sprawdzić makro, który wiersz jest ostatnią datą poniedziałku na karcie Transfer. Musimy także upewnić się, że istnieje. W moim przykładzie, jeśli nie istnieje, po prostu przykleję go do dołu ...
Oto, co napisałem dla mojego przykładu z wieloma komentarzami:
Zauważ, jak mogę skopiować dane za jednym razem za pomocą funkcji wartości Range (). Zwróć też uwagę, jak mogę również określić zakres.
Po uruchomieniu pokazanego powyżej makra powinieneś zobaczyć to na karcie Transfer:
źródło