Avatar billede lineriber Praktikant
04. marts 2013 - 16:31 Der 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
           
       
        openwkb = Workbooks(strFileName).Name 'ActiveWorkbook.Name

        '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?

Mvh
Line
Avatar billede claes57 Ekspert
04. marts 2013 - 17:23 #1
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)
Avatar billede lordnelson Seniormester
04. marts 2013 - 17:31 #2
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
Avatar billede lineriber Praktikant
05. marts 2013 - 08:10 #3
@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???
Avatar billede claes57 Ekspert
05. marts 2013 - 08:46 #4
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:
Avatar billede lineriber Praktikant
05. marts 2013 - 08:53 #5
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?
Avatar billede claes57 Ekspert
05. marts 2013 - 09:45 #6
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
Avatar billede lineriber Praktikant
05. marts 2013 - 11:05 #7
Virker stadig ikke, jeg får samme fejl samme sted igen.
Avatar billede claes57 Ekspert
05. marts 2013 - 11:19 #8
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.
Avatar billede lineriber Praktikant
05. marts 2013 - 15:04 #9
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.

Kan du hjælpe mig videre?
Avatar billede lineriber Praktikant
05. marts 2013 - 15:15 #10
Hvad betyder et-tallet i .SelectedItems(1) ???

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

End Sub
Avatar billede claes57 Ekspert
05. marts 2013 - 15:33 #11
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:
Avatar billede lineriber Praktikant
05. marts 2013 - 16:06 #12
øv, virker ikke. Igen får jeg fejl efter at have valgt folder i dialogboksen!
Så den stopper altså før sItem = ""
Avatar billede claes57 Ekspert
05. marts 2013 - 16:22 #13
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
Avatar billede lineriber Praktikant
06. marts 2013 - 08:23 #14
Hej igen claes57

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.
Avatar billede lineriber Praktikant
06. marts 2013 - 08:35 #15
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".

????
Avatar billede claes57 Ekspert
06. marts 2013 - 10:11 #16
der kommer et tidspunkt, hvor de rigtige superfolk skal på.
send en intern besked (post) til http://www.eksperten.dk/profil/supertekst
med reference til dette spg http://www.eksperten.dk/spm/977748
og bed om hjælp...
Avatar billede lineriber Praktikant
06. marts 2013 - 11:01 #17
he he, kender godt Supertekst. Han har hjulpet mig mange gange før.
Jeg prøver ham, men tak for forsøget :-)
Avatar billede lineriber Praktikant
03. april 2013 - 13:04 #18
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester