Microsoft Office Forum [ www.Office-Fragen.de ] >> READONLY <<
Microsoft Office 2003-2019 => Excel => Thema gestartet von: Carvediem am April 09, 2012, 02:40:29 Vormittag
-
Liebe VBA/Excelianer,
nun habe ich noch eine Frage, die ich nicht beantwortet bekomme: Ich habe ein Tabellenblatt eingerichtet, das ich zum Import von XML-Daten benötige. Einzulesen sind nur wenige Daten (maximal 4x 20 Daten), allerdings wird durch das Makro das gesamte Tabellenblatt genutzt - mit dem Effekt, dass die Excel-Datei mehrere MByte groß wird.
Meine Frage: Kann ich die Größe des Tabellenblatts irgendwie einschränken?
Hier der VBA-Code:
Sub GPSinMarschtabelle
Sheets("Wegpunkte").Visible = True
Sheets("Nebenrechnungen").Visible = True
Sheets("Wegpunkte").Range("A2:G20").Clear
Dim sMsg As String
Dim retval As Long
Dim sPath As String
sMsg = "- Sind die Wegpunkte in der DAV-Karte durchlaufend nummeriert?" _
& vbCr _
& "- Ist die Wegpunktbezeichnung im Format 01, 02, ..., 10, 11, ...?" _
& vbCr _
& "- Ist der Ausgangspunkt als Wegpunkt 01 bezeichnet?" _
& vbCr & vbCr _
& "Das Format für die DAV-Wegpunktdatei ist [waypoints_Name.gpx]"
'MsgBox gibt eine Zahl aus der Aufzählung VbMsgBoxResult zurück:
retval = MsgBox(sMsg, vbYesNo, "Title of MsgBox")
If retval = vbYes Then
sPath = Application.GetOpenFilename
If sPath = "Falsch" Then
MsgBox "Sie haben den Dateiaufruf abgebrochen"
Else
'Die Import-Funktion gibt eine Zahl aus der Aufzählung XlXmlImportResult zurück:
retval = ActiveWorkbook.XmlMaps("gpx_Zuordnung").import(sPath)
Select Case retval
Case xlXmlImportSuccess
'Der Import war erfolgreich...
Case xlXmlImportValidationFailed
'Der Import wurde zwar durchgeführt, aber bei der Schemavalidierung
'für die importierten Daten trat ein Fehler auf...
Case xlXmlImportElementsTruncated
'Der Import konnte nur teilweise durchführt werden, da die XML-Datendatei
'zu groß für das Arbeitsblatt ist....
End Select
End If
Else 'retval=vbNo
MsgBox "Überarbeiten Sie die Wegpunktdatei und starten Sie dann den Import."
End If
ActiveWorkbook.Worksheets("Wegpunkte").ListObjects("Tabelle1").Sort.SortFields. _
Clear
ActiveWorkbook.Worksheets("Wegpunkte").ListObjects("Tabelle1").Sort.SortFields. _
Add Key:=Range("Tabelle1[ns1:name]"), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Wegpunkte").ListObjects("Tabelle1").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Dim x As Integer
Dim lat As Integer
Dim e As Integer
Dim l As Integer
x = 2
lat = 9
n = 9
h = 9
lon = 8
Do Until Sheets("Wegpunkte").Cells(x, 1) = ""
Sheets("Marschtabelle").Cells(lat, 7) = Sheets("Wegpunkte").Cells(x, 1)
Sheets("Marschtabelle").Cells(n, 1) = Sheets("Wegpunkte").Cells(x, 4)
Sheets("Marschtabelle").Cells(h, 8) = Sheets("Wegpunkte").Cells(x, 3)
Sheets("Marschtabelle").Cells(lon, 7) = Sheets("Wegpunkte").Cells(x, 2)
x = x + 1
lat = lat + 2
lon = lon + 2
n = n + 2
h = h + 2
Loop
Sheets("Marschtabelle").Select
Sheets("Wegpunkte").Visible = False
Sheets("Nebenrechnungen").Visible = False
End Sub
Das Tabellenblatt "Wegpunkte" ist das, das ich zum Import benötige. Es ist vorbereitet für die XML-Datei (gpx-Zuordnung). Was kann ich tun, damit es nicht bis Zeile 64k genutzt (und gespeichert) wird?
Vielen Dank im Voraus,
Carvediem
-
Hallo carvediem,
sieh Dir doch einmal das Importergebnis an, wenn Du die OpenXML-Methode benutzt, also:
Dim wb As Workbook
Set wb = Workbooks.OpenXML(Filename:=sGPXPath, LoadOption:=xlXmlLoadImportToList)
Danach per VBA die Spalten markieren, die gebraucht werden, und die Selektion als Excel-Datei abspeichern.
-
Hi Ricco,
zunächst Danke für deine Antwort.
Bei dem Einladen der XML-Daten handelt es sich nicht um einen einmaligen Vorgang, sondern um eine Routine, die immer wieder geschieht, wenn man einen neuen Weg auf einer Landkarte festgelegt hat.
Das von dir vorgeschlagene Anschauen des Importergebnisses habe ich - sorry - zudem noch nicht ganz verstanden. Wenn ich den Code ausführe als ein Sub, dann bekomme ich einen Laufzeitfehler.
Vielleicht zur Orientierung, die Datei, um die es geht, ist kannst du hier anschauen:
http://www.download.i-p4.de/carvediem/Skitourenplaner_2012.zip
(darin ist auch eine Beispiel-XML-Datei)
Dass die übermäßige Größe durch den Einladevorgang in das Wegpunkt-Sheet liegt, konnte ich schon überprüfen. Es geht also jetzt darum, Sorge dafür zu tragen, dass der automatisierte Import nicht zu einer Ausnutzung des gesamten Tabellenblatts führt, wodurch es so viel Speicherplatz benötigt.
Vielleicht hast du ja noch eine Idee ...
-
Hallo Carvediem,
offenbar waren die Ausführungen wohl doch ein wenig zu kurz geraten. Der nachstehende Code zeigt, wie mein Hinweis gemeint war.
---------------------------------------------------------------------------------------------------------------------
Dim wb As Workbook, ws As Worksheet, sGPXPath As String
Dim oList As ListObject, oListCol As ListColumn, sField() As String
Dim i As Integer, r As Range, wsWP As Worksheet
'Den Pfad zu der GPX-Datei festlegen. Hier ist als Verzeichnis F:\Daten angenommen.
'Das ist natürlich durch das richtige zu ersetzen.
sGPXPath = "F:\Daten\waypoints_Oelgrubenspitze.gpx"
Set wb = Workbooks.OpenXML(FileName:=sGPXPath, LoadOption:=xlXmlLoadImportToList)
'Hinweis: Beim Öffnen erscheint eine Meldung, die getrost abgenickt werden kann.
'Will man diese Meldung unterdrücken, dann setze man Application.DisplayAlerts vor dem
'Aufruf auf FALSE und danach direkt wieder auf TRUE.
'Die angegebene LoadOption sorgt dafür, dass die XML-Daten als Listenobjekt eingelesen werden.
'Diese Datenbankstruktur steht in wb in der ersten Tabelle.
Set ws = wb.Worksheets(1)
'Welche Datenbankfelder werden benötigt? Nach Deinen Bemühungen zu urteilen sind dies
'nur die nachstehenden vier:
ReDim sField(1 To 4) As String
sField(1) = "ns1:name"
sField(2) = "lat"
sField(3) = "lon"
sField(4) = "ns1:ele"
'Sollten es mehr sein, dann ist das Feld eben zu erweitern.
'Wir wählen diesen durch die Feldnamen definierten Bereich aus:
Set oList = ws.ListObjects(1)
Set oListCol = oList.ListColumns(sField(1))
Set r = ws.Columns(oListCol.Index)
For i = 2 To 4
Set oListCol = oList.ListColumns(sField(i))
Set r = Excel.Union(r, ws.Columns(oListCol.Index))
Next
'Die neuen Daten sollen offenbar immer in dem gleichen Arbeitsblatt Wegpunkte landen.
'Also sind die alten vorher zu löschen:
Set wsWP = ThisWorkbook.Worksheets("Wegpunkte")
wsWP.UsedRange.Clear
'Wäre das Arbeitsblatt noch gar nicht erstellt, dann würde es natürlich neu angelegt:
'Set wsWP = ThisWorkbook.Worksheets.Add
'wsWP.Name = "Wegpunkte"
'Die ausgewählten Spalten werden in die Tabelle Wegpunkte kopiert; dabei wird gleichzeitig
'die Datenbankstruktur entfernt. Minimaler geht's nimmer.
r.Copy Destination:=wsWP.Range("A1")
'Aufräumen
Erase sField
Set oListCol = Nothing
Set oList = Nothing
Set r = Nothing
Set ws = Nothing
'Die nur temporär erstellte Excel-Datei mit den ganzen GPX-Daten wird nicht mehr benötigt:
wb.Close SaveChanges:=False
---------------------------------------------------------------------------------------------------------------------
MfG,
Ricco.
-
Hi Ricco,
whow, danke-danke-danke. Ich habe gerade Besuch, danach probiere ich das sofort aus. Toll, dass du mir da so viel Hilfe zukommen lässt.
Herzlicher Gruß,
Carvediem
-
Carvediem,
das mach ich doch gerne. Ich hab einfach über Ostern ein wenig Zeit, und es macht Spaß, mal wieder ein wenig in Excel herumzuturnen.
Viel Spaß damit,
Ricco.
-
Hi Ricco,
ich komme jetzt erst dazu, mir deinen Code genauer anzuschauen. Noch habe ich nicht alles ganz durchdrungen, aber ich kann jetzt schon sagen: Das ist raffiniert, wie du das anlegst! Ich habe von Programmierungen überhaupt keine Ahnung und bin echt begeistert, wie das so funktioniert. Ich hab's noch nicht eingearbeitet, aber sobald das erledigt ist, melde ich Vollzug.
Nochmals herzlichen Dank,
Carvediem
-
So, nochmals vielen Dank. Das Problem ist gelöst. Der Code ist eingearbeitet.