2015-01-07 25 views
6

Zacznę od stwierdzenia, że ​​moje doświadczenie z Excelem i VBA jest ograniczone do tego, co widziałem w szkole. Mam doświadczenie w programowaniu, ale w innych językach.Excel VBA Jak wykryć, czy coś zostało wklejone w arkuszu roboczym

Mam plik, który otrzymuję co tydzień. Struktura tego pliku jest zawsze taka sama: ID, nazwa, data, wartość od 1 do 4, nieistotne dane.

Dane te są wybierane za pomocą przycisku "wybierz wszystko" (lewy górny róg arkusza roboczego, mały trójkąt pod nazwą komórki w MS Excel 2013), a następnie kopiowane do innego pliku domyślnego, który zmienia dane w celu wyświetlenia i odfiltrowania różne arkusze na podstawie wartości 1-4 i daty.

Moje pytanie: Jak wykryć, kiedy dane są wklejane? Próbowałem już zdarzenia Worksheet.Change, ale polecenie wklejania (CTRL + V) nie wyzwala zdarzenia Change. Ponadto, w jaki sposób będą kopiowane dane? Czy zaktualizuje wiersz po wierszu, komórka po komórce (w którym kierunku), ...? Wiem, że mogę łatwo znaleźć odpowiedź na ostatnie pytanie przez debugowanie go, gdy tylko wykryję polecenie kopiowania, ale nigdy nie wiesz, czy ktoś zna odpowiedź.

Czy istnieje inny, łatwiejszy (lub lepszy) sposób, aby to zrobić?

W razie potrzeby można podać więcej danych i informacji.

Dziękuję za pomoc.

EDYCJA: "... jest/jest kopiowany?" zmieniono na wklejony, tak jak powinien.

+0

Dlaczego chcesz wiedzieć, czy dane zostały skopiowane? Czy istnieje jakiś szczególny powód? Co chcesz osiągnąć? Czy chcesz wypełnić te dane w innym skoroszycie/skoroszycie? –

+0

Czy widziałeś to: http://www.siddharthrout.com/2011/08/15/vba-excelallow-paste-special-only/? –

+0

@MaciejLos Powodem jest to, że ludzie, którzy będą używać tego pliku, otrzymają co tydzień dużą listę danych. Wkleją tę listę do pierwszego arkusza pliku, nad którym obecnie pracuję i potrzebuję tego pliku, aby następnie odfiltrować odpowiednie dane i wyświetlić je w innych arkuszach roboczych na podstawie pewnych wartości w wierszu. RE: twoja druga uwaga: otworzyłem ją przed moją przerwą, ale nie skończyłem jej czytania. Obecnie próbuję go i wydaje się, że robi to, co chcę. Opublikuje odpowiedź, jeśli tak się stanie. – Nahbyr

Odpowiedz

8
Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim UndoList As String 

    '~~> Get the undo List to capture the last action performed by user 
    UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1) 

    '~~> Check if the last action was not a paste nor an autofill 
    If Left(UndoList, 5) = "Paste" Then 
    'Do stuff 
    End If 
End Sub 

To załatwiło sprawę. Dla tych, którzy potrzebują czegoś podobnego i znają wielkość ich listy, odpowiedź @MaciejLos też by działała.

1

Worksheet_Change Zdarzenie wykona zadanie, jeśli dodasz formułę do komórki, która nigdy nie zostanie nadpisana. Załóżmy, że twoje dane są wklejone do komórki A1 i zajęły 5 kolumn. Tak więc, wpisz poniżej wzoru do 6. kolumnę i wiersz 1.

=COUNTBLANK(A1:A1048576) 

Teraz jesteś w stanie obsłużyć/wykrywać zdarzenia paste;)

+0

To by działało, gdyby nie to, że nie wiem, jak duża będzie lista danych, którą będą importować. Znalazłem poprawkę dotyczącą mojego problemu w linku wysłanym wcześniej. Opublikuje kod. – Nahbyr