Wpis z mikrobloga

Mam prośbę o pomoc do makra VBA w Excel. Jego zadaniem jest scalić wiele plików xls w jeden. Na początku makro pyta o lokację, gdzie ma znaleźć pliki do obróbki, następnie należy wskazać arkusz, w którym scalenie nastąpi. Zazwyczaj po prostu wklejałem ścieżkę dostępu i nazwę pliku ręcznie, ale ostatnio posłużyłem się msoFileDialogFolderPicker do wskazania lokacji (działa bez zarzutu) i getopenfilename do pozyskania nazwy pliku. Niestety, makro się wykrzacza, kiedy ma dojść do wklejenia zawartości jednego z plików do arkusza, gdzie następuje scalania.

StitchedWorkbook = Application
.GetOpenFilename("excel files (*.xls), *.xls")
If fileToOpen <> False Then
MsgBox "Open " & fileToOpen
End If

Powyżej jest część odpowiedzialna za wskazanie nazwy pliku, poniżej reszta kodu:

Windows(StitchedWorkbook).Activate 'tu sie wykrzacza a jesli usune te linijke, to wklejanie w ogole nie nastepuje
Sheets("FILES").Select 'arkusz gdzie nastepuje scalanie ma dwie zakladki, files i data, scalanie nastepuje w data
Row = 2
File
Num = 0
Do
FileNum = FileNum + 1
FiletoProcess(FileNum) = Cells(Row, 1).Value
Row = Row + 1
Loop While Cells(Row, 1).Value <> ""
Num
Files = FileNum

'switch to [DATA] sheet
Sheets("DATA").Select

'open files and copy data to Stitched
Workbook, then close again
For FileNum = 1 To NumFiles
Workbooks.Open Filename:=FiletoProcess(FileNum)
CopyRow = 0
Do
CopyRow = CopyRow + 1
Loop While Cells(CopyRow + 1, 1).Value <> ""
If File
Num = 1 Then
CopyRowRange = "1:" + CStr(CopyRow)
Else
CopyRowRange = "3:" + CStr(CopyRow)
End If
Rows(CopyRowRange).Select
Selection.Copy
Windows(StitchedWorkbook).Activate

PasteRow = 0
Do
PasteRow = PasteRow + 1
Loop While Cells(PasteRow, 1).Value <> ""
Cells(PasteRow, 1).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Windows(File
toProcess(FileNum)).Activate
ActiveWorkbook.Close (False)

Next File_Num

end sub

Nie wiem, czy czasem nie chodzi o poprawne zdefiniowanie obiektów? Dodam, że makro uruchamiane jest z poziomu pliku, w którym następuje scalanie.

Będę wdzięczny, jak komuś zechce się na to zerknąć, bo mam wrażenie, że sprawa jest prosta, tylko brakuje mi doświadczenia.

#pytaniedoeksperta #vba #excel #programowanieobiektowe
  • 9
@Asarhaddon: niestety nie mam w tej chwili czasu żeby się temu dokładniej przyjrzeć, ale tak na szybko: zamiast się bawić activesheetami i innymi dziwnymi rzeczami użyj normalnego adresowania komórek. Tzn.

set wb = Workbooks.Open(Filename:=File_to_Process(File_Num))
i potem

wb.worksheets("nazwa").range("A1:Z10")
i tak dalej. Workbook z którego jest uruchamiane makro jest dostępny pod stałą ThisWorkbook. Działa tak samo, thisworkbook.worksheets("bla bla") itd.
@croppz: ale wlasnie ta zmiane chcialem uniknac wklepywania nazwy pliku, z zalozenia mialem tylko go wskazywac po otwarciu okna dialogowego. Rowniez zakres nie chce, aby byl staly. Ale dzieki za porade.
@Asarhaddon: trochę nie rozumiem z czym masz problem. Nie musisz mieć nazw wpisanych w kodzie żeby używać zmiennych do konkretnych arkuszy zamiast tych zabaw z activesheet i activeworkbook. Spójrz na ten kod, uruchom go sobie i pisz jakby dalej ci coś nie działało.
@croppz: dzięki za to, sprawdzę jutro, bo dzisiaj już nie będę miał możliwości, ale naprawdę dziękuję za poświęcenie czasu. Na szczęście zdążyłem zobaczyć drugi kod, zanim usunąłeś odpowiedź :)

Ten kod działa dobrze, dopóki nie próbuję automatycznie definiować zmiennej stitched_workbook - jeśli jest ona przypisana na stałe, kod działa bardzo dobrze i robi, to co powinien. Chciałem go jednak usprawnić, żeby nie trzeba było wklejać nazwy pliku, która zwykle jest długa
@croppz jeśli chciałoby Ci się wyjaśnić dlaczego nie użyłeś getopenfile? Jaka jest właściwie różnica między tym a file dialog open? Czy pierwsza faktycznie zwraca tylko nazwę pliku, czy też go otwiera? W necie natknąłem się na getfilename, ale nigdzie nie znalazłem ani składni, ani przykładów użycia, wiesz może coś o tej metodzie?

Jeśli z jakiegokolwiek powodu nie chce Ci się odpowiadać, to i tak dzięki za pomoc.
jeśli chciałoby Ci się wyjaśnić dlaczego nie użyłeś getopenfile? Jaka jest właściwie różnica między tym a file dialog open?


@Asarhaddon: z tego co wiem to bez znaczenia. FileDialog ma większe możliwości jeżeli chodzi o konfigurację, ale tutaj i tak z tego nie korzystałem.

Czy pierwsza faktycznie zwraca tylko nazwę pliku, czy też go otwiera?


Oba zwracają ścieżkę wybranego pliku. Ewentualnie kolekcję paru ścieżek jeżeli włączysz multiselecta i wybierzesz więcej niż 1