VBA - auf Namen von Reihen zugreifen
#1
Guten Tag,

ich arbeite viel mit Abfragen aus Datenbanken (Microsoft Query). Wenn ich dazu ein Makro schreibe ist dies alles solange super, bis ich eine weitere Spalte aus der Datenbank ausgeben lassen.
Wenn ich dies mache, muss ich im makro meine ganzen Zahlen (Spalten) anpassen, was sehr nervig ist.

Ich kann Spalten/Bereiche definierte Namen zuordnen. Wie kann ich mit diesen Namen oder generell mit den Überschriften im Makro arbeiten? Leider hab ich bis jetzt noch nichts dazu gefunden.


Gruß
Top
#2
Moin

Mach mal ein Update auf Excel 2019 oder Office 365.
Dann hast du Möglichkeit mit PQ auf die Datenbanken zuzugreifen. Microsoft Query ist Steinzeit.
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Top
#3
Hey,

der betrieb stellt leider keine neueren Versionen zur Auswahl. Deshalb bin ich an Query gebunden.
Top
#4
Hi,

meinst du so etwas:

Code:
' markiert Spalte 8 innerhalb des Namensbereichs "MeineDaten"
Range("MeineDaten").Columns(8).select

' markiert Zeile 2 innerhalb des Namensbereichs "MeineDaten"
Range("MeineDaten").Rows(2).select

' markiert die Überschrift-Zelle über dem Namensbereich "MeineDaten"
Range("MeineDaten").Cells(0).select

' Alle Zellen innerhalb eines benannten Bereichs (nur bestimmte Spalte)
For Each Zelle In Range("MeineDaten").Columns(8).Cells
V
Herzliche Grüße aus dem Rheinland
Jörg

[Windows 10, Microsoft 365]
[-] Folgende(r) 1 Nutzer sagt Danke an LuckyJoe für diesen Beitrag:
  • BMSOBoo
Top
#5
Hier ist ein Code als Beispiel

Um in die jeweilige Spalte zu gelangen, während die Zeile hochzählt, geben ich "Tabelle1.Cells(u, 9).Value" ein. Die "9" möchte ich durch einen Spaltennamen ersetzten. Wenn ich dann eine Spalte einfüge, würde der Name bestehen bleiben und ich muss den Code nicht ändern.

Wenn ich die Spalte alle mit dem Befehl "Range" benannt habe, kann ich dann meinen Befehl ändern in "Tabelle1.Cells(u, "MeineDaten").Value" bzw. wie ist der Verweis auf die jeweilige Tabelle?


Code:
For v = ZeileMax2 - 2 To ZeileMax2 + 2
    For u = 3 To ZeileMax1
   
        'RE-Menge
        If Tabelle1.Cells(u, 9).Value = Tabelle2.Cells(v, 1).Value And Tabelle1.Cells(u, 10).Value = Tabelle2.Cells(v, 10).Value Then
            REMenge = REMenge + Tabelle1.Cells(u, 3).Value
            a = a + 1
        End If
        'S100
        If Tabelle1.Cells(u, 9).Value = Tabelle2.Cells(v, 1).Value And Tabelle1.Cells(u, 4).Value > 0 And Tabelle1.Cells(u, 10).Value = Tabelle2.Cells(v, 10).Value Then
            S100 = S100 + Tabelle1.Cells(u, 4).Value
            b = b + 1
        End If
        'S110
        If Tabelle1.Cells(u, 9).Value = Tabelle2.Cells(v, 1).Value And Tabelle1.Cells(u, 5).Value > 0 And Tabelle1.Cells(u, 10).Value = Tabelle2.Cells(v, 10).Value Then
            S110 = S110 + Tabelle1.Cells(u, 5).Value
            c = c + 1
        End If
        'Mg
        If Tabelle1.Cells(u, 9).Value = Tabelle2.Cells(v, 1).Value And Tabelle1.Cells(u, 10).Value = Tabelle2.Cells(v, 10).Value Then
            Mg = Mg + Tabelle1.Cells(u, 7).Value
            d = d + 1
        End If
        'CAD
        If Tabelle1.Cells(u, 9).Value = Tabelle2.Cells(v, 1).Value And Tabelle1.Cells(u, 10).Value = Tabelle2.Cells(v, 10).Value Then
            CAD = CAD + Tabelle1.Cells(u, 6).Value
            e = e + 1
        End If

    Next u
Top
#6
Hallo,

(15.04.2020, 11:52)BMSOBoo schrieb: Wie kann ich mit diesen Namen oder generell mit den Überschriften im Makro arbeiten?
Sub aaa()
Dim lngSpalte
lngSpalte = Application.Match("Überschrift2DerSpalte", Tabelle1.Rows(1), 0)
If Tabelle1.Cells(u, lngspalte).Value = ...
End Sub
Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • BMSOBoo
Top
#7
Hey,

danke, dass sieht schon einmal gut aus. Problem ist dadurch leider noch nicht ganz verschwunden.
Wenn ich jetzt eine neue Spalte einfüge, muss ich dies trotzdem ändern - zwar nur an einem Punkt aber trotzdem noch nicht ideal.

Hätte da noch jemand eine Idee?
Top
#8
Hi,

Zitat:Wenn ich die Spalte alle mit dem Befehl "Range" benannt habe, kann ich dann meinen Befehl ändern in "Tabelle1.Cells(u, "MeineDaten").Value" bzw. wie ist der Verweis auf die jeweilige Tabelle?

Die Spaltennummer des benannten Bereichs "MeineDaten" erhälst du mit
Code:
Range("MeineDaten").Column
Herzliche Grüße aus dem Rheinland
Jörg

[Windows 10, Microsoft 365]
Top
#9
Das ich den namen beibehalte ist soweit verständlich aber ich definiere ja, in welche Spalte der Name ist



Zitat:Sub aaa()
  Dim lngSpalte
  lngSpalte = Application.Match("Überschrift2DerSpalte", Tabelle1.Rows(1), 0)
  If Tabelle1.Cells(u, lngspalte).Value = ...
End Sub
Top
#10
Hi,

also so ganz genau habe ich dnn noch nicht verstanden, was du suchst:
- Den Namen der aktuellen Tabelle findest du mit "ActiveSheet.Name".
- Die Spalte der aktuellen Zelle findest du mit "ActiveCell.Column".

Suchst du nach der Spaltenbezeichnung z.B. nach Copy/Paste einer Spalte, dann hilft vielleicht das Event "Worksheet_Change(ByVal Target As Range)": mit Target.Column wird die neue Spalte ausgegeben (wohin du kopiert hast).
 ... oder bin ich ganz woanders?  Confused
Herzliche Grüße aus dem Rheinland
Jörg

[Windows 10, Microsoft 365]
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste