Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
976to980
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
976to980
976to980
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Sheets aus mehreren Tabellen
21.05.2008 17:19:00
Bonnie
Hallo zusammen,
ich habe ein "kleines" Problem mit einem Code.
Ich habe diesen Code gefunden und für meine Zwecke angepasst:
Private Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type Size
cx As Long
cy As Long
End Type
Private Declare Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" ( _
lpBrowseInfo As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" ( _
ByVal lPIDL As Long, _
ByVal pszPath As String) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" ( _
ByVal pv As Long)
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" ( _
pDest As Any, _
pSource As Any, _
ByVal dwLength As Long)
Private Declare Function ILCreateFromPath Lib "shell32" _
Alias "#157" ( _
ByVal sPath As String) As Long
Private Declare Function LocalAlloc Lib "kernel32" ( _
ByVal uFlags As Long, _
ByVal uBytes As Long) As Long
Private Declare Function LocalFree Lib "kernel32" ( _
ByVal hMem As Long) As Long
Private Declare Function lstrcpyA Lib "kernel32" ( _
lpString1 As Any, _
lpString2 As Any) As Long
Private Declare Function lstrlenA Lib "kernel32" ( _
lpString As Any) As Long
Private Declare Function FindWindowEx Lib "user32.dll" _
Alias "FindWindowExA" ( _
ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare Function GetWindowDC Lib "user32.dll" ( _
ByVal hwnd As Long) As Long
Private Declare Function GetWindowRect Lib "user32.dll" ( _
ByVal hwnd As Long, _
ByRef lpRect As RECT) As Long
Private Declare Function GetTextExtentPoint Lib "gdi32.dll" _
Alias "GetTextExtentPointA" ( _
ByVal hDC As Long, _
ByVal lpszString As String, _
ByVal cbString As Long, _
ByRef lpSize As Size) As Long
Private Declare Function PathCompactPath Lib "shlwapi.dll" _
Alias "PathCompactPathA" ( _
ByVal hDC As Long, _
ByVal pszPath As String, _
ByVal dx As Long) As Long
Private Const MAX_PATH = 260
Private Const WM_USER = &H400
Private Const BFFM_INITIALIZED = 1
Private Const BFFM_SELCHANGED As Long = 2
Private Const BFFM_SETSTATUSTEXTA As Long = (WM_USER + 100)
Private Const BFFM_SETSTATUSTEXTW As Long = (WM_USER + 104)
Private Const BFFM_ENABLEOK As Long = (WM_USER + 101)
Private Const BFFM_SETSELECTIONA As Long = (WM_USER + 102)
Private Const BFFM_SETSELECTIONW As Long = (WM_USER + 103)
Private Const BIF_NEWDIALOGSTYLE As Long = &H40
Private Const BIF_RETURNONLYFSDIRS As Long = &H1
Private Const BIF_BROWSEINCLUDEFILES As Long = &H4000
Private Const BIF_STATUSTEXT As Long = &H4
Private Const LMEM_FIXED = &H0
Private Const LMEM_ZEROINIT = &H40
Private Const LPTR = (LMEM_FIXED Or LMEM_ZEROINIT)
' Zeigt den BrowseForFolder-Dialog an.

Public Function BrowseForFolder(DialogText As String, _
DefaultPath As String, _
OwnerhWnd As Long, _
Optional ShowCurrentPath As Boolean = True, _
Optional RootPath As Variant, _
Optional NewDialogStyle As Boolean = False, _
Optional IncludeFiles As Boolean = False) As String
' Parameter:
' o DialogText Dialogtext, der oben im Dialog angezeigt wird.
' o DefaultPath Standardmäßig ausgewähltes Verzeichnis.
' o OwnerhWnd hWnd des übergeordneten Fensters (in den meisten
' Fällen Me.hWnd).
' o ShowCurrentPath Legt fest, ob die aktuelle Verzeichnisauswahl
' angezeigt werden soll. Verfügbar ab
' Internet Explorer 4.0 (-> PathCompactPath).
' o RootPath Root-Verzeichnis. Wird es angegeben, werden nur die
' Ordner unterhalb dieses Verzeichnisses angezeigt.
' o NewDialogStyle Legt fest, ob der Dialog in der neuen Darstellung
' angezeigt werden soll (Dialog kann vergrößert/
' verkleinert werden, es ist eine Schaltfläche zum
' Anlegen eines neuen Ordners vorhanden, es können
' Dateioperationen wie löschen etc. ausgeführt
' werden, ...). Ist dieser Parameter True, hat der
' Parameter ShowCurrentPath keine Wirkung. Verfügbar
' unter WinME und Betriebsystemen ab Win2000.
' o IncludeFiles Legt fest, ob auch Dateien im Dialog angezeigt und
' ausgewählt werden können.
' Verfügbar ab Win98 und Internet Explorer 4.0 (bei
' frühreren Windowsversionen muss IE4 inkl. der
' Integrated Shell installiert sein).
Dim biBrowseInfo As BROWSEINFO
Dim lPIDL As Long
Dim sBuffer As String
Dim lBufferPointer As Long
With biBrowseInfo
' Handle des übergeordneten Fensters
.hOwner = OwnerhWnd
' PIDL des Rootordners zuweisen
If Not IsMissing(RootPath) Then .pidlRoot = PathToPIDL(RootPath)
' Dialogtext zuweisen
If ShowCurrentPath And DialogText = "$" Then DialogText = "" ' Wird intern nicht zugelassen
.lpszTitle = DialogText
' Stringbuffer für aktuell selektierten Pfad zuweisen
If ShowCurrentPath Then .pszDisplayName = sBuffer
' Dialogeinstellungen zuweisen
.ulFlags = BIF_RETURNONLYFSDIRS + _
IIf(ShowCurrentPath, BIF_STATUSTEXT, 0) + _
IIf(NewDialogStyle, BIF_NEWDIALOGSTYLE, 0) + _
IIf(IncludeFiles, BIF_BROWSEINCLUDEFILES, 0)
' Callbackfunktion-Adresse zuweisen
.lpfnCallback = FARPROC(AddressOf CallbackString)
' PIDL des vorselektierten Ordnerpfades zuweisen (wird im
' lpData-Parameter an die Callback-Funktion weitergeleitet)
.lParam = PathToPIDL(DefaultPath)
End With
' BrowseForFolder-Dialog anzeigen
lPIDL = SHBrowseForFolder(biBrowseInfo)
If lPIDL Then
' Stringspeicher reservieren
sBuffer = Space$(MAX_PATH)
' Selektierten Pfad aus der zurückgegebenen PIDL ermitteln
SHGetPathFromIDList lPIDL, sBuffer
' Nullterminierungszeichen des Strings entfernen
sBuffer = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)
' Selektierten Pfad zurückgeben
BrowseForFolder = sBuffer
' Reservierten Task-Speicher wieder freigeben
Call CoTaskMemFree(lPIDL)
End If
' Stringspeicher wieder freigeben
If ShowCurrentPath Then Call LocalFree(lBufferPointer)
End Function



Private Function CallbackString(ByVal hwnd As Long, ByVal uMsg As Long, _
ByVal lParam As Long, ByVal lpData As Long) As Long
' Callback-Funktion des BrowseForFolder-Dialogs. Wird bei
' eintretenden Ereignissen des Dialogs aufgerufen.
Dim sBuffer As String
Dim lStaticWnd As Long
Dim lStaticDC As Long
Dim sPath As String
Dim rctStatic As RECT
Dim szTextSize As Size
' Meldungen herausfiltern
Select Case uMsg
Case BFFM_INITIALIZED
' Dialog wurde initialisiert
' Standardmäßig markierten Pfad (dessen PIDL wurde in lpData
' übergeben) im Dialog selektieren
Call SendMessage(hwnd, BFFM_SETSELECTIONA, False, ByVal lpData)
Case BFFM_SELCHANGED
' Selektion hat sich geändert
' Stringspeicher reservieren
sBuffer = Space$(MAX_PATH)
' Aktuell selektierten Pfad ermitteln und anzeigen, wenn möglich
If SHGetPathFromIDList(lParam, sBuffer) Then
' Temporäre Zeichenfolge an das Anzeigelabel senden, um
' dessen Handle anhand dieser Zeichenfolge ermitteln zu können
SendMessage hwnd, BFFM_SETSTATUSTEXTA, 0&, ByVal "$"
' Handle und DeviceContext des Anzeigelabels ermitteln
lStaticWnd = FindWindowEx(hwnd, ByVal 0&, ByVal "Static", ByVal "$")
lStaticDC = GetWindowDC(lStaticWnd)
' Abmessungen des Anzeigelabels ermitteln
GetWindowRect lStaticWnd, rctStatic
' Textabmessungen der Zeichenfolge "Auswahl: " im Anzeigelabel
' ermitteln
GetTextExtentPoint lStaticDC, ByVal DIALOG_CURRENT_SELECTION_TEXT, _
ByVal Len(DIALOG_CURRENT_SELECTION_TEXT), szTextSize
' Anzuzeigenden Pfad auf die Abmessungen des Anzeigelabels
' kürzen; falls dies nicht möglich ist, gesamten Pfad anzeigen
sPath = sBuffer
If PathCompactPath(ByVal lStaticDC, sPath, ByVal (rctStatic.Right - _
rctStatic.Left - szTextSize.cx + 80)) = 0 Then sPath = sBuffer
' Nullterminierung entfernen
sPath = Left$(sPath, InStr(1, sPath, vbNullChar) - 1)
' Pfad im Dialog anzeigen
Call SendMessage(hwnd, BFFM_SETSTATUSTEXTA, 0&, _
ByVal DIALOG_CURRENT_SELECTION_TEXT & sPath)
Else
' Pfadanzeige leeren
SendMessage hwnd, BFFM_SETSTATUSTEXTA, 0&, ByVal ""
End If
End Select
End Function



Private Function FARPROC(FunctionPointer As Long) As Long
' Funktion wird benötigt, um Funktions-Adresse ermitteln
' zu können, dessen Adresse mit AddressOf übergeben und
' anschließend wieder zurückgegeben wird.
FARPROC = FunctionPointer
End Function


' Gibt die lPIDL zum übergebenen Pfad zurück.


Private Function PathToPIDL(ByVal sPath As String) As Long
Dim lRet As Long
lRet = ILCreateFromPath(sPath)
If lRet = 0 Then
sPath = StrConv(sPath, VbStrConv.vbUnicode)
lRet = ILCreateFromPath(sPath)
End If
PathToPIDL = lRet
End Function



Public Sub SearchFileAndCopySheet()
Dim objFS As FileSearch
Dim objFO As Object
Dim objWb As Workbook, objNew As Workbook
Dim strPath As String
Dim intIndex As Integer
Dim iCounter As Integer
On Error GoTo ErrExit
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
.Cursor = xlWait
End With
strPath = BrowseForFolder("Quellverzeichnis auswählen", ThisWorkbook.Path, 0, , , False, False)
If strPath = "" Then GoTo ErrExit
If Right(strPath, 1)  "\" Then strPath = strPath & "\"
Set objFS = Application.FileSearch
Set objFO = CreateObject("Scripting.FileSystemObject")
'Set objNew = Workbooks("zusammen.xls")
With objFS
.NewSearch
.LookIn = strPath
.FileType = msoFileTypeExcelWorkbooks
.SearchSubFolders = False
If .Execute > 0 Then
For intIndex = 1 To .FoundFiles.Count
Set objWb = Workbooks.Open(.FoundFiles(intIndex))
Sheets("monat").Select
Workbooks("zusammen.xls").Activate
objWb.Sheets("Stunden").Move after:=Workbooks("zusammen.xls").Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = objFO.GetBasename(.FoundFiles(intIndex))
objWb.Close False
Set objWb = Nothing
Next
End If
End With
'objNew.Sheets(1).Delete
'objNew.SaveAs strPath & "Zusammenfassung.xls"
ErrExit:
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
.Cursor = xlDefault
End With
Set objNew = Nothing
Set objFS = Nothing
Set objFO = Nothing
End Sub


Der Sinn sollte sein, dass aus einem bestimmten Verzeichnis, aus mehreren Excel-Dateien, ein bestimmtes Blatt (heisst immer "monat") in eine vorhandene Datei (zusammen.xls) kopiert wird (bekommt dort den Namen der Datei aus der kopiert wurde) um dann weiterverarbeitet zu werden. Das klappt auch sehr gut, das Problem ist nur dass die Dateien in dem Verzeichnis nicht gleichzeitig dort liegen, sondern in zeitlichem Abstand. D.h. sie müssten nacheinander "eingelesen" werden (immer nur die die beim ersten Mal nicht da war). Bei obiger Prozedur wird immer wieder das ganze Verzeichnis eingelesen und die schon vorhandenen Blätter in der Zieldatei werden nicht berücksichtigt...... deshalb läuft das Ganze dann natürlich immer auf einen Fehler. Ich komme einfach nicht darauf wie ich das Ganze ändern muss, dass immer nur die neu hinzugekommenen Tabellen genommen werden.
Vielleicht geht das auch gar nicht? Wäre für einen Tipp wirklich dankbar.
Sorry für den langen Code, ich wusste nicht wie ich es sonst erklären soll :-))
Gruß
Bonnie

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sheets aus mehreren Tabellen
21.05.2008 22:53:24
Jürgen
Hallo Bonnie,
wow, was für ein Code. Allerdings baut er mühsam einen Verzeichnisauswahldialog nach - den bringt Excel aber bereits als Bordwerkzeug mit. Nachstehend findest Du den Code, der Dein Problem lösen sollte. Der Teil, nach dem Du gefragt hast, ist im Wesentlichen durch die FunKtion SheetIsMissing gelöst, in der vor dem Öffne / Importieren einer Datei geprüft wird, ob das entsprechende Arbeitsblatt bereits vorhanden ist. Die Lösung geht davon aus, dass das Makro in der Datei "zusammen.xls" steht und die importierten Arbeitsblätter jeweils ans Ende der Datei eingefügt werden.
Gruß, Jürgen

Sub BlaetterEinfuegen()
Dim Quelldatei As Workbook
Dim Auswahldialog As FileDialog
Dim OKGedrueckt As Boolean
Dim Pfad As String
Dim Dateiname As String
Dim DateiNameBasis As String
Set Auswahldialog = Application.FileDialog(msoFileDialogFolderPicker)
Auswahldialog.InitialFileName = ThisWorkbook.Path & "\"
OKGedrueckt = Auswahldialog.Show
If OKGedrueckt Then
Pfad = Auswahldialog.SelectedItems(1) & "\"
Dateiname = Dir(Pfad & "*.xls")
Do Until Dateiname = ""
DateiNameBasis = Left(Dateiname, Len(Dateiname) - 4)
If SheetIsMissing(DateiNameBasis) Then
Set Quelldatei = Workbooks.Open(Pfad & Dateiname)
Quelldatei.Sheets("Monat").Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets. _
Count)
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = DateiNameBasis
Quelldatei.Close False
End If
Dateiname = Dir()
Loop
MsgBox "Fertig!"
End If
End Sub



Function SheetIsMissing(Blattname As String) As Boolean
Dim Blatt As Worksheet
SheetIsMissing = True
For Each Blatt In ThisWorkbook.Sheets
If Blatt.Name = Blattname Then
SheetIsMissing = False
Exit For
End If
Next
End Function


Anzeige
AW: Sheets aus mehreren Tabellen
22.05.2008 11:48:00
Bonnie
Hallo Jürgen,
vielen Dank für die schnelle Antwort. Das sieht ja schon gut aus! Vor allem etwas sparsamer :-))
Ich werde es heute Abend mal probieren und gebe dann Rückmeldung.
Danke und Gruß
Bonnie

AW: Sheets aus mehreren Tabellen
22.05.2008 17:31:15
Bonnie
Hallo Jürgen, ich habe es soeben probiert und es ist jetzt genauso wie ich wollte!
Tausend Dank, ich wünschte ich hätte schon vor einer Woche gefragt (so lange probiere ich schon rum).
Gruß
Bonnie

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige