Namensmanager

Bild

Betrifft: Namensmanager
von: Reaper
Geschrieben am: 28.10.2015 20:02:10

Hi,
Ich hab ne kurze Frage betreffs des Namensmanagers.
Derzeit baue ich eine Mappe zusammen in der mehrere Webabfragen erfolgen (momentan nur 3, könnten sich aber auch noch erweitern).
In meiner ersten ich nenne sie mal Beta sind die Abfragen jeweils in einen Modul und werden über ein Active-X Steuerelement ausgelöst und läuft soweit auch gut.
In einer 2. Mappe versuche ich jetzt die Abfragen durch eine Scheife direkt in einem Steuerelement auszuführen, was auch relativ gut läuft.
Jedoch kommt jetzt der Haken, und zwar wird der Namensmanager bei jeder Abfrage zugemüllt. Wenn irgendwann die finale Mappe zum Einsatz kommt und ich und meine Mitarbeiter damit arbeiten hat man nach einer gewissen Zeit über 100 oder mehr Einträge im Manager.
Bei der Mappe wo die Abfragen in den Modulen sind kommt dieses Phänomen nicht vor.
Ich hoffe Ihr könnt mit in dieser Hinsicht helfen und eventuell erklären woran das liegen könnte.
Danke schon mal in voraus
Gruß
Reaper

Bild

Betrifft: AW: Namensmanager
von: Matthias
Geschrieben am: 28.10.2015 20:38:02
Hallo Reaper,
benötigst du diese Namen nach der Verwendung denn noch, oder können diese gelöscht werden?
Hast du keine Bereiche im Namensmanager die du benötigst und kannst einfach alles löschen, dann tue folgendes:

Dim objName As Name, objConn
For Each objName In ThisWorkbook.Names
    objName.Delete
Next objName
For Each objConn In ThisWorkbook.Connections
    objConn.Delete
Next objConn

Möchtest du jedoch bestimmte Namen behalten, musst du bei der Abfrage aufpassen, wie deine Query genannt wird (.Name-Eigenschaft).
For Each objName In ThisWorkbook.Names
    If objName.Name Like "*NameQuery*" Then objName.Delete
Next objName
For Each objConn In ThisWorkbook.Connections
    If objConn.Name Like "*NameQuery*" Then objConn.Delete
Next objConn

Meist nimmer er den Datei-Namen eins zu eins, kommen die Namen öfters vor wird "_1" usw. angehängt. Desshalb das "Like "*...*". Mit Web-Queries kenn ich mich leider nicht ganz so aus und kann daher nicht 100%ig sagen was dabei rumkommt. Einfach mal den Makrorecorder fragen.
Beim Namen fügen Queries übrigens noch die Tabelle vorne an, auch wenn der Bereich im Namensmanager als "NameQuery" angezeigt wird, so gibt mir objName.Name "Tabelle1!NameQuerey_X" zurück! Bei selbst erstellten Bereichen ist dies jedoch nicht so, also aufpassen!
Probier damit einfach mal rum,
lg Matthias

Bild

Betrifft: AW: Namensmanager
von: Reaper
Geschrieben am: 28.10.2015 21:39:40
Hi,
Wow ging ja schnell. vielen Dank. Ich werds die Tage ausprobieren.
Leider werden in der Mappe einige Bereiche dynamisch gestaltet und benannt, wo im Anschluss nach der Abfrage per Pivot (mehrere) Auswertungen der jeweiligen Datensätze gemacht werden.
Hier ergibt sich das nächste Problem, denn die Namen der Queries ändern sich auch, weil diese Datums bedingt sind.
z.b.
list?end_date_2015_10_28_start_date_2015_10_28_ ....
oder
list?end_date_2015_09_01_start_date_2015_09_03_ ....
oder
summary_report?end_date_2015_07_15_ ...
Also wenn ich zum Beispiel den Datensatz vom 27.10.15 brauche wird der Hyperlink (gelistet in einer entsprechenden Hilfsspalte) per Formel angepasst bevor die Abfrage gestartet wird und deshalb kommen wie oben genannt solche Namen vor.
Das was ich nicht verstehe, bei den Queries die in den einzelnen Modulen laufen wird kein Eintrag getätigt, nur wenn die Queries in der Schleife laufen.
Gruß
Reaper

Bild

Betrifft: AW: Namensmanager
von: EtoPHG
Geschrieben am: 29.10.2015 08:27:18
Hallo Reaper,
Bei VBA gut könnte man voraussetzen, dass Debugging kein Fremdwort ist und die Helfer vielleicht mit wenigsten dem relevante Codeteilen versorgt werden.
Ich bin ziemlich sicher, dass dein Code die .Add Methode auf Query- bzw. 'Pivotquery'-Objekte anwendet und dieses dann nie mehr löscht!
Gruess Hansueli

Bild

Betrifft: AW: Namensmanager
von: matthias
Geschrieben am: 29.10.2015 08:58:27
Hallo Reaper,
wenn deine Namen immer den gleichen Aufbau haben, dann nutze doch weitere Platzhalter für das 'Like':
"*end_date_????_??_??_start_date_????_??_??_*"
Natürlich kann man dies auch kürzer fassen, aber ich weis ja nicht wie eindeutig du es brauchst. Du verstehst jedenfalls worauf ich hinaus will.
lg Matthias

Bild

Betrifft: AW: Namensmanager
von: Reaper
Geschrieben am: 29.10.2015 18:42:02
Hi,
Danke erst mal für die schnellen Antworten.
@ Hansueli ja WebQueries arbeiten meiner Meinung nach immer mit "Add". Das löschen der jeweiligen Queries ist mit im Code eingebaut.
z.b.
.
.
.Refresh BackgroundQuery:=False
.Delete
oder:
For i = wksZiel.QueryTables.Count To 1 Step -1
wksZiel.QueryTables(i).Delete
was den Code angeht hier der Beispielcode
Option Explicit
Dim strLink, strCon, strName As String
Dim lngS, a, i, iCount As Integer
Dim lngZ As Long, z As Long
Dim wsZiel, wksListeLinks, wksZiel, ws(4) As Worksheet
Dim rng As Range
Dim pt As PivotTable

Private Sub Query_Click()
Set ws(0) = Sheets(1)
Set ws(1) = Sheets(2)
Set ws(2) = Sheets(3)
Set ws(3) = Sheets(4)
Set ws(4) = Sheets(5)
Application.ScreenUpdating = False
Application.EnableEvents = False
ws(2).Columns("A:S").Clear
ws(3).Columns("A:S").Clear
ws(4).Columns("A:S").Clear
Set rng = Union(ws(1).Range("A1").CurrentRegion, _
    ws(1).Range("AO1").CurrentRegion, _
    ws(1).Range("BY1").CurrentRegion)
    
rng.Clear
Set wksListeLinks = ws(0)
  With wksListeLinks
    lngZ = .Cells(.Rows.Count, 1).End(xlUp).Row
  End With
For lngZ = 1 To lngZ
iCount = iCount + 1
        
    If ws(2).Cells(1, 1) = "" Then
      Set wsZiel = ws(2)
      Set wksZiel = wsZiel
    Else
        If ws(2).Cells(1, 1).Value <> 0 Then
            Set wsZiel = ws(3)
            Set wksZiel = wsZiel
                If ws(3).Cells(1, 1).Value <> 0 Then
                    Set wsZiel = ws(4)
                    Set wksZiel = wsZiel
                End If
        End If
    End If
    
For i = wksZiel.QueryTables.Count To 1 Step -1 ' optional löschen der Anfrage
    wksZiel.QueryTables(i).Delete
Next
       
    strLink = wksListeLinks.Cells(lngZ, 1)
    strCon = "URL;" & strLink
    strName = strLink
    With wksZiel.QueryTables.Add(Connection:=strCon, _
        Destination:=wksZiel.Range("$A$1"))
        .Name = strName
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlAllTables
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
        .Delete ' optional löschen der Anfrage
    End With
    
lngS = 1
 ' folgender Code muss sein, da der Datensatz Leerzeilen enthält
   
For a = wsZiel.Cells(Rows.Count, lngS).End(xlUp).Row To 1 Step -1 
    If wsZiel.Cells(a, 1).Value = "" Then
        wsZiel.Rows(a).Delete shift:=xlUp
    End If
Next a
        
    If iCount = 10 Then
      iCount = 0
      Set wsZiel = Nothing
    End If
  Next lngZ
' hier erfolgen weitere Sequenzen wie z.b folgende, sind aber derzeit inaktiv
    'For Each pt In ws(4).PivotTables
      'pt.RefreshTable
    'Next pt
 
Application.EnableEvents = True
Application.ScreenUpdating = False
 
End Sub
Wie gesagt die gleichen Queries laufen einzeln in den Modulen der anderen Mappe ohne Einträge.
Das löschen der Namen ist ne gute Alternative, aber mich würde interresieren warum keine Einträge erfolgen aber in einer Schleife schon.
Gruß
Reaper

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Übertragung vieler Kurven in ein Diagramm"