Wpis z mikrobloga

Mircy znający VBA, potrzebuję pomocy. Ja znam tylko trochę pythona, ale potrzebuję makra do tworzenia pliku CSV z jednego arkusza. Skleiłem taki działający kod:

Sub createcsv()
Dim FileName As String
Dim PathName As String
Dim ws As Worksheet

Set ws = ActiveWorkbook.Sheets("SHEET2")
FileName = "NEW
FILE" & Sheets("SHEET1").Range("E6").Value & ".csv"
PathName = Application.ActiveWorkbook.Path
ws.Copy
ActiveWorkbook.SaveAs FileName:=PathName & "\" & FileName,

FileFormat:=xlCSV, CreateBackup:=False

Ale potrzebuję kopiować same wartości, a w tej chwili kopiują mi się formuły (tak, wiem, po zapisaniu pliku CSV zostaną już same wartości, ale chcę żeby się one od razu wyświetlały, a nie żeby były tam formuły).
Jest to pewnie kwestia dodania jednej linijki, z tego co widzę to pewnie wrzucenia gdzieś PasteSpecial xlPasteValues, ale jakoś nie mogę wykminić jak.

#excel #vba
  • 18
@sartek: nie do końca rozumiem jaki to ma sens, ale skoro chcesz...

ThisWorkbook.Worksheets("SHEET2").Copy
ActiveWorkbook.Worksheets(1).UsedRange = ActiveWorkbook.Worksheets(1).UsedRange.Value

No chyba że koniecznie chcesz skopiować od razu zawartość arkusza do nowego pliku. Wtedy to będzie tak:

Set new_wb = Application.Workbooks.Add
Application.DisplayAlerts = False
new_wb.Worksheets(1).Delete
new_wb.Worksheets(1).Delete
Application.DisplayAlerts = True
Set new_ws = new_wb.Worksheets(1)
ThisWorkbook.Worksheets("SHEET2").UsedRange.Copy
new_ws.Cells(1, 1).PasteSpecial xlPasteValues
nie do końca rozumiem jaki to ma sens, ale skoro chcesz...


@croppz: po prostu żeby użyte formuły w tym arkuszu nie były w ogóle widoczne.

Ale ja nie rozumiem, w jaki sposób mam zastosować Twój kod, bo samo doklejenie w którymś miejscu nie zadziała.
@sartek: przecież plik jest zapisywany jako csv i formuły nie są w nim widoczne. Na którym etapie ktoś miałby zobaczyć formuły? Możesz dodać activeworkbook.close na końcu swojego kodu, ale sensu w tym żadnego większego nie ma - osoba uruchamiająca makro i tak może sobie formuły podejrzeć w oryginalnym pliku.
@croppz: Ale plik jest od razu otwierany po uruchomieniu makra (co jest dla mnie ok), no i wtedy są widoczne. Po zapisaniu i otwarciu na nowo, no to tak, nie są już widoczne.
@sartek: cały kod

Filename = "NEW_FILE_" & ThisWorkbook.Sheets("SHEET1").Range("E6").Value & ".csv"
PathName = ThisWorkbook.Path
ThisWorkbook.Worksheets("SHEET2").Copy
ActiveWorkbook.Worksheets(1).UsedRange = ActiveWorkbook.Worksheets(1).UsedRange.Value
ActiveWorkbook.SaveAs Filename:=PathName & "\" & Filename, _
FileFormat:=xlCSV, CreateBackup:=False
@croppz: Dzięki mireczku, działa, kopiowane są od razu same wartości, ale na wejściu mam komunikat "Object required" i nazwa też nie zaczytuje się poprawnie, tylko mam po prostu Book1.
@croppz Nazwy zmiennych się różniły (przy zapisywaniu pliku był podkreślnik w środku).

Ale swoją drogą komunikaty błędów w VBA to takie średnio pomocne są. Mam nadzieję, że nie będę musiał się uczyć tego języka, bo jakoś średnio przyjemne by to chyba było, jak ja już negatywnie nastawiony do tego jestem xD

Jeszcze raz dzięki!
@sartek: no język jest dość okropny, fakt. Z błędami się jeszcze zabawniej robi jak napiszesz sobie jakąś klasę - nie dostajesz nawet informacji gdzie dokładnie ten błąd wystąpił. Do tego nie ma dziedziczenia, konstruktorów, obsługa wyjątków ogranicza się do on error resume next / if err.number = x... Długo by tak można wymieniać ( ͡° ͜ʖ ͡°)

@croppz No ja ogólnie zacząłem od razu od pythona do pracy z danymi, ogarniam trochę pandas, a o vba to od początku czytałem, że nie warto, no ale niestety, wszystkiego w pythonie nie zrobię, no ale skoro płacą, to nie mam wyboru ( ͡° ͜ʖ ͡°)
@sartek imho warto, bo mnóstwo pomocnych rzeczy zrobisz w parę minut a i jeśli nie pracujesz w IT to pracodawca może kręcić nosem - bo to albo nie masz admina na kompie, a to nikt tego nie obsłuży jak odejdziesz, a to coś innego. Szkoda gadać.
@Mr_NiceGuy: W przypadku pythona obejściem na brak admina jest Anaconda, więc jakoś można sobie poradzić, jedynie kwestia tego, czy rzeczywiście można daną rzecz zrobić w pythonie, czy może jednak nie będzie wyjścia i trzeba się męczyć z VBA.