Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1560to1564
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Codenamen in Variabeln

Codenamen in Variabeln
06.06.2017 07:31:38
Norbert
Hallo ich arbeite mit korrelierenden Dummy-Arbeitsblättern tbl_00_11_EI und tbl_00_16_AB. Diese werden je nach Bedarf X-Mal kopiert. Wenn in bestimmten Zellen Veränderungen stattfinden, möchte ich nun Daten aus den neuen korrelierenden Arbeitsblättern tbl_nn_11_EI nach tbl_nn_16_AB kopieren. Bezüglich der Flexibilität würde ich dies gerne über Variablen erledigen. Das Versorgen der Variable Eingabe mit dem aktiven Codenamen tbl_nn_11_EI und der Variable Abmessung mit dem aktiven Teil-Codenamen “tbl_nn_“ und “16_AB“ ist kein Problem.
Nun möchte ich bestimmte Daten kopieren und hierfür die Variablen benutzen.
Variable Eingabe(Codename) + .Range("B32:B47").Copy
Variable Abmessung(Codename) + .Range("B3:B18").PasteSpecial Paste:=xlPasteValues
Wie lautet das korrekte “Ansprechen“ über den Codenamen in einer Variablen?
Über ihre Hilfe würde ich mich sehr freuen.

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Codenamen in Variabeln
06.06.2017 08:54:02
ChrisL
Hi Norbert
Sub t()
Dim intNummer As Integer
Dim WS1 As Worksheet, WS2 As Worksheet
intNummer = 1 'Beispiel
Set WS1 = Worksheets("tbl_" & Format(intNummer, "00") & "_11_EI")
Set WS2 = Worksheets("tbl_" & Format(intNummer, "00") & "_16_AB")
WS2.Range("B3:B18") = WS1.Range("B32:B47").Value
End Sub

cu
Chris
AW: Codenamen in Variabeln
07.06.2017 11:28:28
Norbert
Hallo Chris,
ich habe deinen Eintrag erst heute in der Forenliste entdeckt. Sorry für die verspätete Rückmeldung.
Beim Ausführen deines Makros kommt die Fehlermeldung:
"Laufzeitfehler 9" "Index außerhalb des gültigen Bereichs".
Ich denke, dass der Variable die Eigenschaft Objekt fehlt, wenn über den Codenamen gearbeitet wird.
Ich hätte mir gewünscht, dass es so einfach ginge. Sepp hat dies über eine Funktion gelöst.
Grüße Norbert
Anzeige
AW: Codenamen in Variabeln
09.06.2017 03:01:02
Norbert
Hallo Chris,
dein Makro funktioniert zwar, aber die Tabellen sollen über den Codenamen und nicht über den Namen angesprochen werden. In deinem Beispiel müsste (Name) = tbl_01_16_AB und Name = Tabelle1 lauten.
Ich habe hierzu mal folgenden Code getestet:
Sub AAVar1()
Dim ws        As Worksheet
' Eingabe des Codenamens in einem Wort --> funktioniert
Set ws = tbl_00_16_AB
ws.Name = "Januar"
Range("B5").Value = "XX"
ws.Range("C5").Value = "Hugo"
End Sub
Sub AAVar2()
Dim ws        As Worksheet
Dim intNummer As Integer
intNummer = 0
' Eingabe des Codenamens Zusammengesetzt --> funktioniert nicht
Set ws = Worksheets("tbl_" & Format(intNummer, "00") & "_16_AB") ' Fehler beim Set
ws.Name = "Februar"
Range("B6").Value = "YY"
ws.Range("C6").Value = "Fritz"
End Sub
Auch die Zuweisung des Codenamens über einen Zwischenschritt (Variable als String) funktioniert nicht.
Vielen Dank für deine Hilfe.
Anzeige
AW: Codenamen in Variabeln
09.06.2017 09:00:23
ChrisL
Hi Norbert
Das geht nur über Umweg:
Sub t()
Dim wksIndex As Worksheet, wksMeins As Worksheet
Dim intNummer As Integer
Dim strInternerName As String
intNummer = 1
strInternerName = "tbl_" & Format(intNummer, "00") & "_16_AB"
For Each wksIndex In ThisWorkbook.Worksheets
If wksIndex.CodeName = strInternerName Then
Set wksMeins = wksIndex
Exit For
End If
Next wksIndex
MsgBox wksMeins.Name
End Sub

cu
Chris
AW: Codenamen in Variabeln
06.06.2017 09:03:49
Sepp
Hallo Norbert,
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub test()
Dim objSht1 As Worksheet, objSht2 As Worksheet
Dim lngIndex As Long

lngIndex = 0

Set objSht1 = getSheetByCodename("tbl_" & Format(lngIndex, "00") & "_11_EI")
Set objSht2 = getSheetByCodename("tbl_" & Format(lngIndex, "00") & "_16_AB")

If Not objSht1 Is Nothing And Not objSht2 Is Nothing Then
  objSht2.Range("B3:B18") = objSht1.Range("B32:B47").Value
End If

Set objSht1 = Nothing
Set objSht2 = Nothing
End Sub

Private Function getSheetByCodename(ByVal strCodeName As String, Optional ByRef objWorkBook As Workbook) As Object
Dim objSheet As Object
On Error GoTo ERRORHANDLER
If objWorkBook Is Nothing Then Set objWorkBook = ThisWorkbook
For Each objSheet In objWorkBook.Sheets
  If objSheet.CodeName = strCodeName Then
    Set getSheetByCodename = objSheet
    Set objSheet = Nothing
    Exit Function
  End If
Next
ERRORHANDLER:
Set getSheetByCodename = Nothing
End Function

Gruß Sepp

Anzeige
AW: Codenamen in Variabeln
06.06.2017 12:32:38
Norbert
Hallo Sepp,
vielen Dank für die Lösung. Funktioniert prima.
Mit meinen bescheidenen VBA Kenntnissen versuche ich immer noch den Code nachzuvollziehen.
Ein direktes Ansprechen ist scheinbar nicht möglich. Deshalb ergeben sich daraus noch weitere Fragen.
Den Kopiervorgang muss ich für verschiedene Bereiche durchführen. Dies funktioniert auch. Für das obige Beispiel muss ich zusätzlich die Farbformatierung übertragen. Für zwei andere Bereiche müsste ich einmal die erste linke Stelle und einmal ab Stelle drei den Rest Kopieren. Geht dies auch "Global" in einem Rutsch oder muss ich dies über eine Schleife händeln.
Anzeige
AW: Codenamen in Variabeln
06.06.2017 12:42:59
Sepp
Hallo Norbert,
beschreibe, was genau von wo nach wo kopiert werden soll.
"Für das obige Beispiel muss ich zusätzlich die Farbformatierung übertragen werden"
Welche Formatierung, Hintergrund, Schrift oder gar bedingte Formatierung?
Gruß Sepp

AW: Codenamen in Variabeln
06.06.2017 13:30:40
Norbert
Hallo Sepp,
für den Bereich .Range("B32:B47") muss noch die Zellfarbe (Interior.Color) übertragen werden.
Left und Mid habe ich schon in einer Schleife gelöst, oder gibt es eine Möglichkeit die
Left Bzw. Mid Funktion über den ganzen Bereich ohne Schleife auszuführen?
AbmessungZeile = 3
For EingabeZeile = 32 To 47
objSht2.Range("G" & AbmessungZeile) = Left(objSht1.Range("H" & EingabeZeile).Value, 1)
AbmessungZeile = AbmessungZeile + 1
Next
AbmessungZeile = 3
For EingabeZeile = 32 To 47
objSht2.Range("H" & AbmessungZeile) = Mid(objSht1.Range("H" & EingabeZeile).Value, 3, 11)
AbmessungZeile = AbmessungZeile + 1
Next
Anzeige
AW: Codenamen in Variabeln
06.06.2017 13:37:34
Sepp
Hallo Norbert,
die Schleife sind OK, geht nur so.
Für die Formate:
If Not objSht1 Is Nothing And Not objSht2 Is Nothing Then
  objSht1.Range("B32:B47").Copy
  objSht2.Range("B3:B18").PasteSpecial xlPasteValues
  objSht2.Range("B3:B18").PasteSpecial xlPasteFormats
  Application.CutCopyMode = False
End If

Gruß Sepp

Anzeige
AW: Codenamen in Variabeln
07.06.2017 08:53:33
Norbert
Hallo Sepp,
die Anweisungen funktionieren alle. Ich habe das Makro im Zieltabellenblatt aufgerufen. Hat nahezu keine Laufzeit.
Danach habe ich die Anweisungen in mein Worksheet_Change(ByVal Target As Excel.Range) der Ausgangstabelle eingebaut. Trotz Application.ScreenUpdating = False und Application.Calculation = xlCalculationManual flackert der Cursor. Für die Abarbeitung der Schleifen werden 6 x 16 Zeilen durchlaufen. Bis zu der Position vor den Schleifen läuft der Code sehr schnell ohne flackern. Ich habe vor den Schleifen ein Activate der Zieltabelle eingebaut. Dies hat aber auch nichts gebracht. Kann es an der Art des Zugriffs über den Codenamen in den Variablen liegen? Für den Zugriff ist mir noch die Variante über den Blattindex eingefallen. Das Zielblatt liegt fünf Blätter weiter. Erschien mir aber nicht so sicher. Außerdem würde ich recht ungern alles nochmal umprogrammieren. Fällt dir hierzu noch etwas als Hilfe ein.
Im Voraus schon einmal besten Dank auch für die vorangegangene Hilfestellung. Grüße Norbert
Anzeige
AW: Codenamen in Variabeln
07.06.2017 09:21:14
Sepp
Hallo Norbert,
wenn du im Change-Event Änderungen in der Tabelle vornimmst, dann wird mit jeder Änderung der Code erneut aufgerufen! Setze am Anfang Application.EnableEvents = False und am Ende Application.EnableEvents = True.
Gruß Sepp

AW: Codenamen in Variabeln
07.06.2017 11:19:14
Norbert
Hallo Sepp,
es hat sich die Laufzeit vielleicht marginal etwas verbessert. Das flackern ist aber immer noch da.
In der Ausgangstabelle wird ein Begriff aufgesplittet. Deine Bezeichnungen habe ich angepasst.
In den Schleifen laufen noch andere Anweisungen. Sind aber die beiden nachfolgenden zwei Zeilen
auskommentiert, tritt das flackern nicht mehr auf.
objAbmessung.Range("G" & AbmessungZeile) = Left(objEingabe.Range("H" & EingabeZeile).Value, 1)
objAbmessung.Range("H" & AbmessungZeile) = Mid(objEingabe.Range("H" & EingabeZeile).Value, 3, 11)
Grüße Norbert
Anzeige
AW: Codenamen in Variabeln
07.06.2017 11:46:22
Sepp
Hallo Norbert,
dann hast du "Application.EnableEvents = False" etc. an der falschen Stelle stehen.
Gruß Sepp

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige