Welche Schritte sind erforderlich, um diesen VB-Code in Excel 2013 zu verwenden?

0

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
raindelay
quelle
Wo erzählst du es, um das U-Boot zu starten? Es kann in einer Zelle oder in einem workheet_change-Ereignis oder an einem anderen Ort ausgeführt werden. Es muss irgendwo angerufen werden.
wbeard52
Ich glaube nicht, dass ich es gerade irgendwo anrufe. Der obige Code ist alles, was ich habe. Aufgrund der Frage, wo ich es gefunden habe, dachte ich, es sei ein einfacher Kopier- und Einfügevorgang, aber jetzt sehe ich, dass dies nicht der Fall ist. Im Idealfall möchte ich, dass es immer dann ausgeführt wird, wenn sich eine Zelle ändert.
Raindelay

Antworten:

1

ThisWorkbookund SheetXObjekte 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 es Publicund Sie können es von überall anrufen.

Das nächste Problem sind die Parameter. Von der Implementierung aus Shwird erwartet, dass es sich um ein WorksheetObjekt handelt, und es Targetist ein RangeObjekt: 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:

Module1.Workbook_TwoWayMatch Sheet42, Sheet42.Range("Z123")

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.

Mathieu Guindon
quelle
0

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".

Bungo
quelle
Ich habe es versucht, aber es hat keinen Effekt.
Raindelay