Ich versuche, den VB-Code aus dieser Frage in Excel 2013 zu verwenden, und es funktioniert nicht. Ich kenne mich mit VB nicht aus und vermisse höchstwahrscheinlich einen einfachen Schritt.
Private Sub Workbook_TwoWayMatch(ByVal Sh As Object, ByVal Target As Range)
If UCase(Sh.Name) = "sheet1" Or UCase(Sh.Name) = "sheet2" Then
If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
Application.EnableEvents = False
If UCase(Target.Parent.Name) = "SHEET1" Then
Sheets("Sheet2").Range("A1") = Target
Else
Sheets("Sheet1").Range("A1") = Target
End If
Application.EnableEvents = True
End If
End If
End Sub
Unter Verwendung einer neuen Arbeitsmappe mit den Arbeitsblättern Sheet1 und Sheet2 habe ich in Visual Basic Folgendes versucht:
- Einfügen des Codes in das Objekt: ThisWorkbook
- Einfügen des Codes in die Objekte: Sheet1 (Sheet1) und Sheet2 (Sheet2)
- Einfügen des Codes in alle 3 Objekte
- Sicherstellen, dass die Arbeitsmappe als Makro gespeichert ist
- Sicherstellen, dass die Sicherheitseinstellungen der Arbeitsmappe so festgelegt sind, dass der Zugriff auf das VBA-Objektmodell vertrauenswürdig ist und Makros aktiviert sind
Was muss ich tun, damit dieser Code ausgeführt wird?
Als Antwort auf den Vorschlag von Mat's Mug:
Ich habe den Code wie von Ihnen vorgeschlagen in ein Standardmodul eingefügt, die Prozedur in Öffentlich geändert und den Bereich geändert. Es ist mir jedoch immer noch nicht möglich, die Werte aus dem Bereich auf ein Blatt auf das andere zu kopieren. Der Code sieht jetzt so aus:
Public Sub Workbook_TwoWayMatch(ByVal Sh As Object, ByVal Target As Range)
If UCase(Sh.Name) = "SHEET1" Or UCase(Sh.Name) = "SHEET2" Then
If Not Application.Intersect(Target, Range("A1:J23")) Is Nothing Then
Application.EnableEvents = False
If UCase(Target.Parent.Name) = "SHEET1" Then
Sheets("Sheet2").Range("A1:J23") = Target
Else
Sheets("Sheet1").Range("A1:J23") = Target
End If
Application.EnableEvents = True
End If
End If
End Sub
microsoft-excel
vba
microsoft-excel-2013
raindelay
quelle
quelle
Antworten:
ThisWorkbook
undSheetX
Objekte sind spezielle „Dokument“ Klasse Module; Makros sind in Standardmodulen einfacher verfügbar zu machen . Fügen Sie daher, anstatt sie überall dort einzufügen , ein neues Codemodul (.bas) hinzu und fügen Sie es dort ein.Am einfachsten fügen Sie ein neues Codemodul hinzu, indem Sie mit der rechten Maustaste auf eine beliebige Stelle im Projektexplorer klicken (Strg + R) und Einfügen > Modul auswählen .
Das nächste Problem ist, dass das Verfahren ist
Private
. "Privat" bedeutet, dass jeder Code, der diese Prozedur sehen und aufrufen muss, sich im selben Bereich befinden muss - dh im selben Modul. Machen Sie esPublic
und Sie können es von überall anrufen.Das nächste Problem sind die Parameter. Von der Implementierung aus
Sh
wird erwartet, dass es sich um einWorksheet
Objekt handelt, und esTarget
ist einRange
Objekt: Um die Prozedur auszuführen, müssen Sie die Parameter angeben.Dafür gibt es viele Möglichkeiten.
Eine davon ist, das unmittelbare Fenster aufzurufen (Strg + G) und es direkt aufzurufen:
Natürlich variieren die tatsächlichen Parameter, die Sie übergeben, je nachdem, was Sie erreichen möchten, aber ich hoffe, dass Sie auf die Idee kommen.
quelle
Das Problem könnte sein, dass
UCase(Sh.Name) = "sheet1"
in Zeile 2 niemals etwas passiert.Versuchen Sie, diese in
"SHEET1"
und zu ändern"SHEET2"
.quelle