04. marts 2013 - 16:31Der er
17 kommentarer og 1 løsning
Hjælp til fejl på VBA kode
Hej eksperter
Jeg har haft en kollega til at skrive en VBA kode til mig, som kan kopiere et defineret område med data fra en masse ens filer og indsætte dem i en ny fil, så jeg får én lang datatabel med data fra ca 50 filer.
Jeg har brugt koden i Excel 2007. Jeg har nu opgraderet til Excel 2010 og ligepludselig kan jeg ikke kører koden. Jeg får fejl 400!
Koden er som følger og fejlen opstår efter at jeg har valgt hvilken mappe som filerne med dataene er i:
Sub hentdata() Call openall Call sletoverskrifter End Sub
Sub openall() 'On Error Resume Next With Application .DisplayAlerts = False .EnableEvents = False .ScreenUpdating = False .Calculation = xlCalculationManual End With
Dim fldr As FileDialog Dim sItem As String Set fldr = Application.FileDialog(msoFileDialogFolderPicker) With fldr .Title = "Select a Folder" .AllowMultiSelect = False .InitialFileName = strPath If .Show <> -1 Then GoTo NextCode sItem = .SelectedItems(1) End With NextCode: getfolder = sItem Set fldr = Nothing Dim strFileName As String strFileName = Dir(getfolder & "\*.xls*") Do If Len(strFileName) <> 0 And strFileName <> ThisWorkbook.Name Then Workbooks.Open strFileName, False
'DO YOUR CODE HERE For Each sht In Workbooks(openwkb).Worksheets For Each cell In ThisWorkbook.Worksheets("CONSOLIDATE DATA").Range("A2:A100") If cell.Value = "" Then Exit For If sht.Name = cell.Value Then a = cell.Offset(0, 1).Text Workbooks(openwkb).Sheets(sht.Name).Range(a).Copy endrow = ThisWorkbook.Sheets(sht.Name).Range("A65000").End(xlUp).Row If endrow = 1 Then endrow = 0 ThisWorkbook.Sheets(sht.Name).Cells(endrow + 1, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False End If Next cell Next sht
Workbooks(openwkb).Close
End If strFileName = Dir Loop Until Len(strFileName) = 0 ending: With Application .DisplayAlerts = True .EnableEvents = True .ScreenUpdating = True .Calculate .Calculation = xlCalculationAutomatic End With
End Sub
Sub sletoverskrifter() For Each sht In ThisWorkbook.Worksheets For Each cell In ThisWorkbook.Worksheets("CONSOLIDATE DATA").Range("A2:A" & ThisWorkbook.Sheets("CONSOLIDATE DATA").Range("A65000").End(xlUp).Row) a = sht.Name If cell.Value = sht.Name Then endrow = ThisWorkbook.Sheets(sht.Name).Range("A65000").End(xlUp).Row Set myrng = ThisWorkbook.Worksheets(sht.Name).Range("A2:A" & endrow) myStrings = "Cost center"
'myrng.Select With myrng
Do Set FoundCell = myrng.Find(What:=myStrings, _ After:=.Cells(.Cells.Count), _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) 'Use xlPart If you want to search in a part of the FoundCell 'If you use LookIn:=xlValues it will also delete rows with a 'formula that evaluates to "Ron" If FoundCell Is Nothing Then Exit Do Else FoundCell.EntireRow.Delete End If Loop
End With
End If Next cell Next sht End Sub
Er der nogen der han løse mit problem så jeg igen kan komme til at bruge min VBA?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
du kan gå ind i 'makro' og starte din makro så den kører en linje ad gangen (Afspil trinvis). Så vil den stoppe på den linje, der giver fejlen, og løsning kan findes ret enkelt (hvis 2010 er bare lidt kompatibel med 2007)
De fleste gange der komme fejl i VBA kode når man skifter til en anden version, er det missing object, i VBa under tools / references , se om der ikke er en missing object der
@claes57: jeps det er jeg klar over, derfor skrev jeg at det var lige efter at jeg havde valgt mappen som filerne skulle findes i. Den stopper ved " If .Show <> -1 Then GoTo NextCode" Når jeg afspiller i breakmode får jeg denne fejl: "Run-time error '1004': Application-defined or object-defined error."
@lordnelson: jeg ved ikke helt hvad jeg skal kigge efter i den menu du henviser til... Jeg får en liste med en helt masse "Available References", som kan til og fravælges. De eneste der er tilvalgt er: - Visual Basic for Applications - Microsoft Excel 14.0 Object Library - OLE Automation - Microsoft Office 14.0 Object Library Hvad skal jeg mere tilvælge???
man kan vende den om fra With fldr .Title = "Select a Folder" .AllowMultiSelect = False .InitialFileName = strPath If .Show <> -1 Then GoTo NextCode sItem = .SelectedItems(1) End With NextCode:
til i stedet (nextcode udgår, og er derfor remmet ud) With fldr .Title = "Select a Folder" .AllowMultiSelect = False .InitialFileName = strPath If .Show = -1 Then sItem = .SelectedItems(1) End With 'NextCode:
har lige prøvet, og får samme fejl. Jeg tror at det er "sItem = .SelectedItems(1)" delen det er galt med istedet for den del jeg skrev til dig..... Kan der være noget galt med den?
det er så nok lige .Show = -1 eller den originale .Show <> -1 der fejler. -1 er True, så prøv den originale kode med If .Show <> True Then GoTo NextCode
jeg har ikke 2010, så du må selv prøve at finde ud af, om Application.FileDialog(msoFileDialogFolderPicker) kender/bruger .SelectedItems(1) og .Show
eller om en af dem er rettet til noget andet - typisk burde du kunne gå ind i makro, og sætte cursor på et af de to ord, og trykke på F1 - så viser hjælp direkte om det.
uha nu er vi langt ude over min VBA viden! så vær sød lige at have lidt tålmodighed med mig... . Hvis jeg placerer cursoren på Application.FileDialog(msoFileDialogFolderPicker) og trykker F1, så får jeg pop-up boks med hjælp vedr "Application.FileDialog Property". Her er bla. nævnt at "msoFileDialogFolderPicker. Allows user to select a folder.". Så den må altså findes.
Så skriver du om den "Kender/bruger" .SelectedItems(1) og .Show. Hvordan finder jeg ud af det?
Der er i den tidligere omtalte pop-up bla et eksempel på en kode, hvor .Show og .SelectedItems er brugt:
In this example, Microsoft Excel opens the file dialog allowing the user to select one or more files. Once these files are selected, Excel displays the path for each file in a separate message.
Sub UseFileDialogOpen()
Dim lngCount As Long
' Open the file dialog With Application.FileDialog(msoFileDialogOpen) .AllowMultiSelect = True .Show
' Display paths of each file selected For lngCount = 1 To .SelectedItems.Count MsgBox .SelectedItems(lngCount) Next lngCount
End With
End Sub
Hvis jeg placerer cursoren på .SelectedItems(1) og .Show, så kommer jeg ikke direkte ind i noget hjælp der vedrører dem, blot forsiden til Excel 2010 Developer hjælpen.
Jeg har søgt efter hjælp om .SelectedItems og har fundet dette, hvor jeg ikke nogen steder ser at der bruges "(1)":
Use the SelectedItems property with the FileDialog object to return a FileDialogSelectedItems collection. The following example displays a File Picker dialog box and displays each selected file in a message box.
Sub Main()
'Declare a variable as a FileDialog object. Dim fd As FileDialog
'Create a FileDialog object as a File Picker dialog box. Set fd = Application.FileDialog(msoFileDialogFilePicker)
'Declare a variable to contain the path 'of each selected item. Even though the path is aString, 'the variable must be a Variant because For Each...Next 'routines only work with Variants and Objects. Dim vrtSelectedItem As Variant
'Use a With...End With block to reference the FileDialog object. With fd
'Allow the selection of multiple file. .AllowMultiSelect = True
'Use the Show method to display the File Picker dialog box and return the user's action. 'The user pressed the button. If .Show = -1 Then
'Step through each string in the FileDialogSelectedItems collection For Each vrtSelectedItem In .SelectedItems
'vrtSelectedItem is aString that contains the path of each selected item. 'You can use any file I/O functions that you want to work with this path. 'This example displays the path in a message box. MsgBox "Selected item's path: " & vrtSelectedItem
Next vrtSelectedItem 'The user pressed Cancel. Else End If End With
'Set the object variable to Nothing. Set fd = Nothing
jeg har nuppet eksemplet, og lagt det ind i din kode, så (1) udgår.
With fldr .Title = "Select a Folder" .AllowMultiSelect = False .InitialFileName = strPath ' If .Show <> -1 Then GoTo NextCode ' sItem = .SelectedItems(1) If .Show = -1 Then sItem = "" For Each vrtSelectedItem In .SelectedItems ' gemmer kun den første hvis flere... If sItem = "" Then sItem = vrtSelectedItem Next vrtSelectedItem Else GoTo NextCode End If End With NextCode:
så gå tilbage til originalen igen (bare så der ikke er indført nye fejl) se på de 3 linjen før .Title = "Select a Folder" .AllowMultiSelect = False .InitialFileName = strPath hvis du sætter en ' i starten af en af dem (prøv dem på skift) og fejlen forsvinder, så har vi synderen
Jeg har gjort som du skrev ovenfor, men det ændrer intet. Fejlen kommer igen når jeg når "If .Show <> -1 Then GoTo NextCode". Jeg prøvede så at sætte ' i starten af den linie, hvilket gjorde at koden fint kørte videre, men boksen hvor jeg skal vælge en folder kommer så aldrig frem. Næste fejl opstår så længere nede i linien "Workbooks.Open strFileName, False"
Kan det være noget af det som lordnelson skrev om: "De fleste gange der komme fejl i VBA kode når man skifter til en anden version, er det missing object, i VBa under tools / references , se om der ikke er en missing object der" ?? Han svarede aldrig på mit spørgsmål om hvad jeg skulle gøre i den menu han henviste til.
Nå, prøvede lige lidt mere udfra en kode jeg fandt via google, bare for at se hvad der skete.
Jeg erstattede If .Show <> -1 Then GoTo NextCode med If .Show <> -1 Then Exit Sub End If
Det resulterede i at jeg fik boksen op til at vælge folder i, folderstien blev dermed = sItem (hvis jeg kigger i "Locals Window"), koden kører videre, getfolder = folderstien, strFIleName = første filnavn i den angivede mappe, men så fejler den igen ved "Workbooks.Open strFileName, False".
Hej claes57 Jeg endte med at få hjælp hos den person der oprindelig skrev koden, og det viste sig at være nogle små passager med et mellemrum formeget mm. De er nu rettede og min VBA virker igen :-) Jeg lukker derfor spørgsmålet.
Mvh Line
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.