Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1744to1748
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

Druckbereich geschlossener Datei auslese

Druckbereich geschlossener Datei auslese
21.03.2020 10:34:38
Chris
Hallo zusammen,
ich bin noch relativ neu in der VBA Welt und komme bei einem Problem einfach nicht weiter.
Ich hoffe Ihr könnt mir dabei helfen.
Ich Programmiere ein Excel-Addin was aus einer geschlossenen Datei Daten Auslesen soll.
In der Datei befinden sich mehrere Sheets von denen immer der komplette Inhalt kopiert werden soll.
Zu dem Kopieren von Daten aus einer geschlossenen Datei habe ich bereits einiges gefunden und das klappt auch soweit. (code folgt am Ende)
Jetzt zu meinem Problem:
1.
In dem Macro muss bisher ein Zellenbereich angeben werden der kopiert werden soll. Da sich der Inhalt jedoch ändern kann hab ich mir überlegt das man den eingestellten Druckbereich nimmt und kopiert. Somit müsste die Person die Änderungen an der Datei vornimmt nur den Druckbereich ändern und nicht das Macro.
2.
Bisher werden von meinem Code nur die Inhalte der Zellen kopiert. Ich würde gerne ebenfalls die Eigenschaften mit kopieren.
3.
Bisher werden die Kopierten Inhalte an die Stelle kopiert wo die derzeit aktive Zelle ist. Desweiteren sollen die anderen Zellen nach unten verschoben werden und nicht einfach durch den kopierten Inhalt überschrieben werden.
Ich hoff Ihr könnt mir bei meinen Problemen helfen und hoffe das mein Vorhaben überhaupt möglich ist.
Option Explicit
Dim datei As String, Blatt As String, Bereich As Range, zelle As Object
Public Function GetDataClosedWB(SourcePath As String, _
SourceFile As String, sourceSheet As String, _
SourceRange As String, TargetRange As Range) As Boolean
'Holt einen Bereich aus einer _geschlossenen_ Arbeitsmappe
'Nur in VBA zu verwenden; nicht aus einer Tabellenzelle heraus
' wird durch die HoleDaten aufgerufen
Dim strQuelle       As String
Dim Zeilen          As Long
Dim Spalten         As Byte
On Error GoTo InvalidInput
strQuelle = "'" & SourcePath & "[" & SourceFile & "]" & sourceSheet & "'!" & Range( _
SourceRange).Cells(1, 1).Address(0, 0)
Zeilen = Range(SourceRange).Rows.Count
Spalten = Range(SourceRange).Columns.Count
With TargetRange.Cells(1, 1).Resize(Zeilen, Spalten)
.Formula = "=IF(" & strQuelle & "="""",""""," & strQuelle & ")"
.Value = .Value
End With
GetDataClosedWB = True
Exit Function
InvalidInput:
GetDataClosedWB = False
End Function
Public Sub HoleDaten(Pfad As String, datei As String, Blatt As String)
' Die Funktion arbeitet mit der obrigen GetDataClosedWB zusammen
Dim Bereich         As String
Dim Ziel            As Range
Bereich = "A1:M9"   ' aus welchem Bereich soll er holen?
Set Ziel = ActiveCell  ' in welchen Bereich soll er kopieren? Genauer gesagt: _
Bei welcher Zelle soll er anfangen, Datein reinzukopieren? Bsp: ActiveCell geht auch
If GetDataClosedWB(Pfad, datei, Blatt, Bereich, Ziel) Then
MsgBox "Daten importiert"
End If
End Sub

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Weshalb öffnest du nicht einfach...
21.03.2020 11:18:53
Beverly
Hi Chris,
...die Arbeitsmappe, ermittelst den Druckbereich, liest alles aus und schließt sie wieder?


AW: Weshalb öffnest du nicht einfach...
21.03.2020 12:14:56
Chris
Hallo Beverly,
bisher müssen pfad, datei, blatt und Zellen angegeben werden.
Anhand der Daten werden dann die benannten Zellen kopiert und in die Offene Arbeitsmappe eingefügt.
Die Ausgelesene Datei bleibt dabei geschlossen.
AW: Weshalb öffnest du nicht einfach...
21.03.2020 14:50:37
Beverly
Hi Chris,
ja, ich sehe schon was dein Code macht, aber das kann man eben auch anders realisieren, indem man die auszulesende Mappe öffnet und die Daten dann ausliest - wenn man dabei Application.ScreenUpdating auf False setzt, bekommt der Benutzer gar nicht mit, dass die Arbeitsmappe geöffnet wurde.


Anzeige
AW: Defined names
21.03.2020 11:34:10
Fennek
Hallo,
in der Workbook.xml steht das PrintAreas:


Hier ein Test mit einer OO im Formalt xl2013 gespeichert. Das kann über "Namespace" auch aus einer geschlossenen Datei ausgelesen werden.
mfg
(für Normal-User ist der Rat: Öffne die Datei)
AW: Defined names (ohne kleiner Zeichen)
21.03.2020 11:39:07
Fennek
die Foren-Software hat Problem mit den kleiner größer Zeichen:

#definedName function="false" hidden="false" localSheetId="0" name="_xlnm.Print_Area"  _
vbProcedure="false"#Tabelle1!$A$1:$B$2##definedName###definedNames#

Anzeige
AW: Defined names (ohne kleiner Zeichen)
21.03.2020 12:33:02
Chris
Hallo Fenneck,
vielen Dank für deine schnelle Antwort. Ein öffnen der Datei kommt leider nicht in Frage. Denn genau die Arbeit soll das Tool hinterher einem Abnehemen. Ich habe hinterher mehrere Dateien mit vielen Seiten aus denen das Tool jeweils den richtigen Inhalt herauskopiert.
Dazu habe ich oben im Menüband mehrere Schaltflächen die ein Dropdown öffnen.
Die Schaltflächen Spiegeln die Datei wieder und das Drop down das Blatt.
Dieser Teil klappt auch bisher ganz gut. Fehlt nur noch der Rest. :-D
Kannst du mir sagen wo ich den Code einfügen muss?
Vielen Dank
AW: Defined names (ohne kleiner Zeichen)
21.03.2020 12:53:22
Daniel
Hi
Wenn die Datei geöffnet ist, geht vieles einfacher und schneller.
Auch das Makro kann die Datei öffnen und wieder schließen.
Dazu gibt es die Befehle Workbooks.Open und Workbook("Dateiname").Close.
Wenn du die Datei schreibgeschützt öffnest, gibts auch keine Probleme, wenn jemand parallel damit arbeitet.
Wie das geht, steht in der Hilfe.
Gruß Daniel
Anzeige
AW: schaun wir mal ...
21.03.2020 14:00:23
Fennek
Hallo,
hier ein Code der die PrintAreas ohne die Dateien zu öffnen ausliest. Der Code kommt in ein neues Workbook, dass die Ergebnisse sammelt, aber sich nicht selbst auslesen kann.

Public Shl As Object
Public Reg As Object
Public Dic As Object
Public lr As Long
Sub Workbook_auslesen()
Set Shl = CreateObject("Shell.Application")
Set Reg = CreateObject("vbscript.regexp")
With Reg
.Global = True
.IgnoreCase = True
.MultiLine = True
.Pattern = "Print_Area.*?"
End With
Pt_Fl = Application.GetOpenFilename(filefilter:="xls? Files (*.xls?), *.xls?", MultiSelect:= _
True)
For Each f In Pt_Fl
pos = InStrRev(f, "\")
Fl = Right(f, Len(f) - pos)
FileCopy f, Environ("temp") & "\" & Fl & ".zip"
Next f
lr = Cells(Rows.Count, 1).End(xlUp).Row + 1
f = Dir(Environ("temp") & "\*.zip")
Do While Len(f)
Cells(lr, 1) = f
Shl.Namespace(Environ("temp")).copyHere Shl.Namespace(Environ("temp") & "\" & f).items.Item( _
"xl\workbook.xml")
WB_read
Kill Environ("temp") & "\workbook.xml"
f = Dir
lr=lr+1
Loop
End Sub
Sub WB_read()
Open Environ("temp") & "\workbook.xml" For Input As #1
c00 = Input(LOF(1), #1)
Close #1
'URL
p1 = InStr(1, c00, "url")
If p1 > 0 Then
p2 = InStr(p1 + 5, c00, Chr(34))
Cells(lr, 2) = Mid(c00, p1 + 4, p2 - p1 - 3)
End If
'PrintArea
ls = 3
Set RR = Reg.Execute(c00)
For i = 0 To RR.Count - 1
p1 = InStr(1, RR(i), ">")
Cells(lr, ls) = Mid(RR(i), p1 + 1, Len(RR(i)) - p1 - 2)
ls = ls + 1
Next i
End Sub
Sieh dir den Code kritisch an, es ist gedacht als Forensik, nicht unbedingt für "business user"
mfg
Anzeige
AW: da ging etwas schief
21.03.2020 14:24:29
Chris
Hallo Fenneck,
ich Versuche das mal ans Laufen zu bekommen.
Schonmal vielen Dank für deine Hilfe. ^^
AW: Powershell
21.03.2020 18:39:09
Fennek
es geht auch ohne Excel

$shell = New-Object -ComObject shell.application
$f = 'C:\users\xxx\Desktop\DruckBereich.xlsx'   # anpassen
$Ziel = 'C:\users\xxx\Desktop\test'             # anlegen
rename-item $f ($f + '.zip')
remove-item ($Ziel + '\workbook.xml') -ErrorAction SilentlyContinue
$zip = $shell.NameSpace(($f + '.zip'))
$shell.Namespace($ziel).CopyHere($zip.items().item('xl\workbook.xml'))
$wb = Get-Content ($Ziel + '\workbook.xml')
$Re = $wb | Select-String -Pattern 'Print_Area.*?&lt/' -AllMatches
foreach ($rr in $Re.Matches) {$rr.value}
Rename-Item ($f + '.zip') $f

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige