Nejste přihlášen/a.

Přihlásit se do poradny

 

VBA - nefunguje po uložení

Od: tronmkiheda* odpovědí: 5 změna:

Dobrý den,

mám tento kód. Jeho smyslem je načíst ze souboru v nesprávném formátu data a provést jejich transformaci do správného tvaru pro další zpracování. Kód funguje. Bez problému. Tj. otevře se zdrojový soubor, požadovaná záložka ("dotazník") se vloží do používaného souboru, proveden se její transformace. Jenž vše funguje pouze do té doby, než se soubor uloží. Po opakovaném otevření a použití souboru již nic neprovede a hlásí chybu Runtime Error 1004.

Pokud kód vložím do nově vytvořeného souboru, situace se opakuje, tj. dokud to neuložím, tak vše funguje tak, jak má, pak už ne. Zjistil jsem, že chyba je už někde na začátku, zdrojový soubor (Workbooks.Open (a1) se vůbec neotevře, myslím, že problé bude někde v oblasti otevírání souboru a vkládání záložky do druhého souboru.

V příloze jsou dva soubory : pokus5.xlsm, který má ten problém, a testovací firma.xlsx, což je soubor k transformaci.

Edit: soubory se asi nepodařilo vložit...

Předem díky za pomoc

(P.S.: jsem v této věci čistý amatér, je možné, že kód rozhodně není optimální)

Předem děkuji za pomoc Martin Hodek

Sub import()

Application.DisplayAlerts = False
Dim a1 As String
a1 = Sheets("import").Range("B1").Value

If a1 = "" Or Sheets("import").Range("C1").Value = "Soubor nemá správnou koncovku!" Then
MsgBox ("Nesprávně zadaný název souboru v buňce B1")
Else
Workbooks.Open (a1)
Workbooks(a1).Activate
Workbooks(a1).Worksheets("dotazník").Copy before:=ThisWorkbook.Worksheets("import")
Sheets("dotazník").Name = "Zdroj pro import"
Workbooks(a1).Close
Sheets("Zdroj pro import").Activate
Dim d1 As Integer
d1 = WorksheetFunction.CountIfs(Range("A:A"), "1. EVIDENČNÍ ÚDAJE ZAMĚSTNAVATELE")
Dim e1 As Integer
For e1 = 1 To d1
Dim f1 As String
Sheets.Add(after:=Sheets("Import")).Name = "dotazník" & e1
f1 = "dotazník" & e1
Sheets("Zdroj pro import").Activate
Dim b1 As Integer
Dim c1 As Integer
b1 = WorksheetFunction.Match("Úřad práce České republiky", Columns(2), 0)
c1 = WorksheetFunction.Match("1. EVIDENČNÍ ÚDAJE ZAMĚSTNAVATELE", Rows(b1 + 6), 0)
Range(Cells(b1, c1), Cells(b1 + 127, c1 + 10)).Select
Application.CutCopyMode = False
Selection.Copy
Sheets(f1).Select
Range("A2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("DotazKFormatovani").Select
Cells.Select
Selection.Copy
Sheets(f1).Select
Cells.Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("A2").Value = "Úřad práce České republiky"
Range("A3").Value = "Krajská pobočka v " & Sheets("import").Range("D6").Value & ", kontaktní pracoviště " & Range("D24").Value
Range("A4").Font.Bold = True
Range("A4").Value = "MONITOROVACÍ DOTAZNÍK"
Range("A127").Font.Italic = True
Range("A127").Value = Sheets("DotazKFormatovani").Range("A127")
Range("A129").Value = Sheets("DotazKFormatovani").Range("A129")
Range("B129").Value = Sheets("DotazKFormatovani").Range("B129")
Range("D24:E28").Merge
Range("D24").Value = Sheets("DotazKFormatovani").Range("D24")
Range("A39, A41, A56, A67, A98").Font.Size = 8
ActiveWindow.Zoom = 120
Range("A1").Select
Sheets("Zdroj pro import").Range("1:130").Delete
Next
End If
Sheets("import").Activate
Dim g1 As Integer
g1 = ThisWorkbook.Sheets.Count - 3
Range("B4").Value = g1
Dim h1 As Integer
h1 = WorksheetFunction.Search(".", Range("B1"))
Dim i1 As String
i1 = Left(Range("B1").Value, h1 - 1)
Dim j1 As Integer
For j1 = 1 To g1
Dim k1 As String
k1 = "dotazník" & j1
Dim m1 As String
m1 = Sheets(k1).Range("B24").Value
Cells(j1 + 4, 2).Value = i1 & " okres " & m1 & ".xlsx"
Next
ActiveWorkbook.SaveAs Filename:= _
ThisWorkbook.Path & "\" & Range("D1").Value, FileFormat:=xlOpenXMLWorkbookMacrosEnabled
Application.DisplayAlerts = True


doplněno 10.12.20 14:06:

Díky za reakci. soubory jsem doplnil (před tím jsem je omylem vybíral jako obrázky, proto se neuložily). co se týče toho krokování, to už jsem udělat před položením dotazu a chybu to vyhodí vždy poté, co to označí "Workbooks.Open (a1)". Co se týče té koncovky xlsx, tam by snad problém být neměl, protože to neslouží k ukládání, ale pouze k vypsání připraveného názvu souboru do buňky. Ukládání vybraných dotazníků (v imporotovaném souboru jich může být až 12 pod sebou, smyslem je je "rozsekat" do samostatných souborů), se provádí dalším makrem ulozit1(), které ještě ale není dopracováno.

proměnné:

a1 - název souboru, který se má importovat, d1 - určení počtu dotazníků, které jsou v importovaném souboru (pro určení délky cyklu), f1 - spojení slova "dotazník" a pořadové číslovky, určuje název listu, do kterého se každý jeden "vypreparovaný" dotazník uloží. c1 a b1 - určují začátek oblasti, která se má kopírovat, tj. vlastně to, kde je další dotazník.

Proměnné g1 - počet dotazníků, který byl vypreparován, další poté slouží k textovému složení názvu souboru, pod kterým bude daný dotazník uložen (fakticky složení názvu souboru, ze kterého byl vypreparován, slova okres a názvu okresu, který je uveden v daném dotazníku).

Ještě jednou díky.


pokus5.xlsm 53.8 kB
testovací firma.xlsx 33.87 kB

 

 

5 odpovědí na otázku
Řazeno dle hodnocení

 

 

lobo*
hodnocení

2x

V kódu si ještě doplň odkaz na konkrétní list u tohoto řádku

.Range("A3").Value = "Krajská pobočka v " & Worksheets("import").Range("D6").Value & ", kontaktní pracoviště " & Range("D24").Value


Poradte.zip 86.55 kB

 

lobo*
hodnocení

2x

Ahoj, dneska sem ještě jednou prošel kód a upravil chybky, které sem včera přehlídnul a přidal další možnost jak načíst soubor přes "Výběrové okno". Jméno souboru ani koncovka nemusí být uvedena v buňce.

V modulu "Module2" je kód na separátní uložení všech dotazníků do samostatných souborů.


Poradte rev.2.zip 90.85 kB
tronmkiheda*

Moc děkuji, to jsem opravdu neočekával. Naprosto skvělé. Vím, že tohle mi chybí. Já to sice nějak uplácám, ale nemám základy.
Co se týče toho vypisování souboru do buňky, to tam nechám. Je to tam úmyslně, aby si ten, kdo to bude fakticky používat (a to nebudu já), mohl určit název souboru, který chce, protože každý si volí jinou strukturu názvů, pod kterými dotazníky ukládá.
Má představa byla taková, že si uživatel upraví názvy souboru, vedle toho budou zaškrtávací políčka, kterými určí, které soubory vůbec chce, a pak to jedním makrem najednou uloží do samostatných souborů. Ale s tím se chci potrápit sám, zase se na tom něco naučím.
Jinak by mne moc zajímalo, jestli jste odhlalil to, kde fakticky byla ta chyba, která způsobovala, že to nefungovalo.

Ještě jednou moc díky a krásný den.

lobo*

Jestli myslíš to otvírání souboru, tak proměnná (tebou nazvaná a1) obsahovala jen název souboru. Pro jeho otevření je však nutné zadat i úplnou cestu

Tedy:

"testovací firma.xlsx" vs "C:\Users\Intel_I3\Desktop\Poradte rev.2\testovací firma.xlsx"

Jak už sem psal, v editoru si zobraz okno Local a při krokování kódu koukej na hodnoty proměnných. Když si porovnáš oba kódy tak Ti to bude jasný.

Jinak xlOpenXMLWorkbookMacroEnabled sem musel nahradit konstantou 52 jinak kód neprošel kompilací, což zase není jasný mě.(Excel 2016) *ee*

 

lobo*
hodnocení

0x

Bez těch vzorových souborů to půjde težko, nikdo netuší jakých hodnot nabývají proměnné. To jejich nicneříkající pojmenování taky ničemu nepomůže.

V editoru si zobraz okno Locals, kód krokuj F8 a hledej.

Problém může být i tohle FileFormat:=xlOpenXMLWorkbookMacrosEnabled vs & ".xlsx"

 

 


 

 

 

Přihlásit se k odběru odpovědí z této otázky:

Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz.

Používáním poradny vyjadřujete souhlas s personifikovanou reklamou, která pomáhá financovat tento server, děkujeme.

Copyright © 2004-2025 Poradna Poradte.cz. Všechna práva vyhrazena. Prohlášení o ochraně osobních údajů. | [tmavý motiv]