Avatar billede kim1a Ekspert
16. oktober 2015 - 11:59 Der er 9 kommentarer og
1 løsning

VBA Opsamling fra flere ark fejl i kode

Jeg er nu ved at skrue min vba sammen via de input jeg fik fra
thor_ostergaard
www.it-fjernundervisning.dk
I spørgsmålet: http://www.eksperten.dk/spm/1006322, men en kort forklaring:

Jeg står i et faneblad i en mappe, hvor jeg ønsker en makro der åbner en række (alle) workbooks i en mappe på vores fællesdrev. Går det samme faneblad ("Sap Data") igennem i hver workbook finder linjer som indeholder et bestemt reg nr og kopierer dem ind i min oprindelige fane fra række 9 og ned.

Jeg er gået i stå i følgende udtryk:
If Range(wkbInput.Worksheets("SAP data").Range(ranRæk, 12)).Value = strVognID Then

Den melder fejl object. Jeg forsøger blot at sige at linje x,12 (kolonne k i pågældende linje) er lig med et defineret reg nr.
Min variabel for ranRæk er på tidspunktet for fejl = 432107, så det er som om de fleste rækker virker?

Min kode ser således ud:
Sub skab_vognkort()
    ' Optimering af åbning og gennemløb
    Dim cal As Integer
    cal = Application.Calculation
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False

    ' Definer variable
    Dim wkbMaster As Workbook
    Dim wkbInput As Workbook
    Dim strMappe As String
    Dim strFil As String
    Dim ranRæk As Range
    Dim strVognID As String
       
    ' Udfyld variable
    Set wkbMaster = ActiveWorkbook
    strMappe = wkbMaster.Names("regnskabsfiler").RefersToRange.Value
    strFil = Dir(strMappe & "\*.*")
    strVognID = wkbMaster.Sheets(2).Range("B2").Value
   
    ' Fjern skrivebeskyttelse fra faneblad
    ActiveSheet.Unprotect
   
    Do While strFil <> ""
        ' Laver gennemløb af alle filer i mappen defineret i B1
        Set wkbInput = Workbooks.Open(strMappe & "\" & strFil, False, True)
        ' Kopierer hver linje der i kolonne 12 (k) har samme reg nr som står i B2
        For Each ranRæk In Range(wkbInput.Worksheets("SAP data").Range("A3"), wkbInput.Worksheets("SAP data").Range("A1").Offset(wkbInput.Worksheets("SAP data").Rows.Count - 1, 0).End(xlUp)).Cells
            If Range(wkbInput.Worksheets("SAP data").Range(ranRæk, 12)).Value = strVognID Then
            ranRæk.EntireRow.Copy wkbMaster.Worksheets(2).Range("A9").Offset(wkbMaster.Worksheets(2).Rows.Count - 1, 0).End(xlUp).Offset(1, 0)
            End If
        Next
        wkbInput.Close
    Loop
   
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
   
    ' Afslut optimering og "almindeliggøre" Excel kalkulationer
    ActiveWorkbook.ActiveSheet.Protection = True
    Application.Calculation = cal
    Application.ScreenUpdating = True
End Sub


Hjælp :-)
Avatar billede bak Seniormester
16. oktober 2015 - 12:30 #1
prøv at ændre
If Range(wkbInput.Worksheets("SAP data").Range(ranRæk, 12)).Value = strVognID then

til
If ranRæk.offset(,12)=strVognID then
Avatar billede kim1a Ekspert
16. oktober 2015 - 13:19 #2
Ja nu løber den igennem uden fejl, men den sætter ikke linjerne ind, og den lukker ikke mit skema der åbnes for gennemløb.
16. oktober 2015 - 15:19 #3
Prøv med

If ranRæk.Offset(0, 12)).Value = strVognID
16. oktober 2015 - 15:20 #4
If ranRæk.Offset(0, 12).Value = strVognID Then

(en enkelt parantes for meget)
Avatar billede kim1a Ekspert
16. oktober 2015 - 15:31 #5
Den går så i stå i næste linje:

ranRæk.EntireRow.Copy wkbMaster.Worksheets(2).Range("A9").Offset(wkbMaster.Worksheets(2).Rows.Count - 1, 0).End(xlUp).Offset(1, 0)

Hvor den igen har ranRæk værdien: 432107

Jeg undrer mig meget. Jeg har forsøgt at sikre mig der ikke er flere rækker under. Filen den åbner og gennemløber har i fanebladet "SAP data" 176 rækker

Tror I det vil give mening at angive en variant som nulstilles for hvert loop der giver antallet af rækker i fanebladet?

Med min begrænsede forståelse skulle den være:
For ranRæk 3 to X (variablen der angiver antal rækker i det konkrete ark)
If range(ranRæk, 12) = strVognID then copy blabla
end if
Next
Avatar billede kim1a Ekspert
16. oktober 2015 - 15:40 #6
Kan det evt. være noget med active workbook har ændret sig, fordi den er igang med at kigge en anden workbook igennem?

Eller når jeg definerer wkbMaster tidligt til active - husker den så på den, uanset at active egentlig skifter?
16. oktober 2015 - 15:52 #7
ranRæk er et objekt, der peger på den celle i kolonne a den er kommet til.
Værdien er indholdet af cellen.

Vil du vide hvilken række det drejer sig om skal du bruge ranRæk.Row.

wkbMaster.Worksheets(2).Range("A9").Offset(wkbMaster.Worksheets(2).Rows.Count - 1, 0).End(xlUp).Offset(1, 0)

Skal være

wkbMaster.Worksheets(2).Range("A1").Offset(wkbMaster.Worksheets(2).Rows.Count - 1, 0).End(xlUp).Offset(1, 0)
Avatar billede kim1a Ekspert
19. oktober 2015 - 12:05 #8
Det må være meget jeg ikke forstår. Jeg troede bare jeg kunne sikre mig at den hoppede 9 rækker ned, men fint. Da jeg ændrede det kørte den. Dog går den nu i en uendelig løkke og kopierer de samme to linjer fra det samme skema igen og igen.

Do While strFil <> ""
        ' Laver gennemløb af alle filer i mappen defineret i B1
        Set wkbInput = Workbooks.Open(strMappe & "\" & strFil, False, True)
        ' Kopierer hver linje der i kolonne 12 (k) har samme reg nr som står i B2 i vognkortfilen
        For Each ranRæk In Range(wkbInput.Worksheets("SAP data").Range("A3"), wkbInput.Worksheets("SAP data").Range("A1").Offset(wkbInput.Worksheets("SAP data").Rows.Count - 1, 0).End(xlUp)).Cells
            If ranRæk.Offset(, 11).Value = strVognID Then
            ranRæk.EntireRow.Copy wkbMaster.Worksheets("Vognkort").Range("A1").Offset(wkbMaster.Worksheets("Vognkort").Rows.Count - 1, 0).End(xlUp).Offset(1, 0)
            End If
        Next
        wkbInput.Close
        Loop

Hvad gør jeg yderligere galt?

(beklager de mange spm)
19. oktober 2015 - 12:29 #9
Du mangler strFil = dir lige før dit loop.
Avatar billede kim1a Ekspert
19. oktober 2015 - 12:54 #10
Så smukt. Tak for al din hjælp. Den færdige kom til at se således ud:

' Optimering af åbning og gennemløb
    Dim cal As Integer
    cal = Application.Calculation
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False

    ' Definer variable
    Dim wkbMaster As Workbook
    Dim wkbInput As Workbook
    Dim strMappe As String
    Dim strFil As String
    Dim ranRæk As Range
    Dim strVognID As String
       
    ' Udfyld variable
    Set wkbMaster = ActiveWorkbook
    strMappe = wkbMaster.Names("regnskabsfiler").RefersToRange.Value
    strFil = Dir(strMappe & "\*.*")
    strVognID = wkbMaster.Sheets(2).Range("B2").Value
   
    ' Fjern skrivebeskyttelse fra faneblad
    ActiveSheet.Unprotect
   
    Do While strFil <> ""
        ' Laver gennemløb af alle filer i mappen defineret i B1
        Set wkbInput = Workbooks.Open(strMappe & "\" & strFil, False, True)
        ' Kopierer hver linje der i kolonne 12 (k) har samme reg nr som står i B2 i vognkortfilen
        For Each ranRæk In Range(wkbInput.Worksheets("SAP data").Range("A3"), wkbInput.Worksheets("SAP data").Range("A1").Offset(wkbInput.Worksheets("SAP data").Rows.Count - 1, 0).End(xlUp)).Cells
            If ranRæk.Offset(, 11).Value = strVognID Then
            ranRæk.EntireRow.Copy wkbMaster.Worksheets("Vognkort").Range("A1").Offset(wkbMaster.Worksheets("Vognkort").Rows.Count - 1, 0).End(xlUp).Offset(1, 0)
            End If
        Next
        wkbInput.Close
        strFil = Dir
        Loop
   
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
   
    ' Afslut optimering og "almindeliggøre" Excel kalkulationer
    ActiveSheet.Protect
    Application.Calculation = cal
    Application.ScreenUpdating = True
End Sub
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

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