Excel Macro loopt vast op simpele verwijzing naar range en cel

Status
Niet open voor verdere reacties.

jonathan11

Gebruiker
Lid geworden
19 apr 2017
Berichten
8
Hoi
Ik ben bezig te leren om zelf macro’s te schrijven. Ik heb een vraag. Ik schreef onderstaande code in Module 1 in bijgevoegd bestand. De bedoeling is dat de macro het werklijstje in tabblad Naomi afboekt in het tabblad voorraad met de bronlijst, daar van de items uit tabblad Naomi de status te wijzigen naar ‘Done’. Ik had al begrepen dat je code met formules of verwijzingen naar meerdere tabbladen in de Visual Basic Studio moet plaatsen in een module, niet in een blad.

Probleem dat ik tegenkom is dat bijvoorbeeld de macro “Done_Naomi” blijft vastlopen op verwijzingen naar een range of cel met foutmelding “Fout 1004, fout tijdens uitvoering”, zelfs de meest eenvoudige verwijzing naar cel Q2 in tabblad Voorraad loopt vast. Ongeacht of ik het schrijf als Cells(2,17), Range(“Q2”), met of zonder object Workbook Workbook.Sheets(“Voorraad”)/Sheets(“Voorraad”). Nu loopt hij vast op de range in dit gedeelte:
With ThisWorkbook.Sheets("Voorraad").Cells(2, 17)
.FormulaR1C1 = "=Done"
.AutoFill destination:=Range(Cells(2, 17), Cells(Usedrows_voorraad, 17))
End WithBekijk bijlage Werkvoorraad.xlsm
Ik heb het idee dat ik vastloop omdat ik iets fundamenteels over het hoofd zie of niet weet. Kan iemand mij helpen erachter te komen waar ik iets verkeerd doe?

Alvast bedankt
Jonathan


Sub Done_Naomi()
'
' Done_Naomi Macro
'
' Sneltoets: Ctrl+uu
'
Dim Usedrows_Naomi As Integer
Dim Usedrows_voorraad As Integer
Dim Curr_employee As String
Dim rng As Range

Usedrows_Naomi = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Usedrows_voorraad = Sheets("Voorraad").Cells(Rows.Count, 2).End(xlUp).Row
Curr_employee = ActiveSheet.Name

With ActiveSheet.Cells(2, 11)
.Value = "Done"
.AutoFill destination:=ActiveSheet.Range(Cells(2, 11), Cells(Usedrows_Naomi, 11))
End With
With ThisWorkbook.Sheets("Voorraad").Cells(2, 17)
.FormulaR1C1 = "=Done"
.AutoFill destination:=Range(Cells(2, 17), Cells(Usedrows_voorraad, 17))
End With
With Cells(2, 18)
.FormulaR1C1 = "=Done_Naomi”
.AutoFill destination:=Sheets("voorraad").Range(Cells(2, 18), Cells(Usedrows_voorraad, 18))
End With
Sheets("Voorraad").Range("R2").FormulaR1C1 = "=Done_Naomi"
ThisWorkbook.Sheets("Voorraad").Cells(2, 17).Activate
ThisWorkbook.Sheets("Voorraad").Range(Cells(2, 17), Cells(Usedrows_voorraad, 18)).AutoFill destination:=Range(Cells(2, 17), Cells(Usedrows_voorraad, 18)), Type:=xlFillDefault
Sheets("Voorraad").Cells(2, 18).Activate
ActiveCell.AutoFill destination:=Range(Cells(2, 18), Cells(Usedrows_voorraad, 18)), Type:=xlFillDefault
Sheets("Voorraad").Range("Q:R").Copy
Sheets("Voorraad").Columns("P:Q").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Naomi").Columns("A:K").ClearContents

End Sub
 
Welkom bij HelpMij! Kun je de code in de tijd dat we zoeken alsnog opmaken met de CODE knop? Dan is hij wat leesbaarder.
 
Zeker, bij deze...

Code:
Sub Done_Naomi()
'
' Done_Naomi Macro
'
' Sneltoets: Ctrl+uu
'
Dim Usedrows_Naomi As Integer
Dim Usedrows_voorraad As Integer
Dim Curr_employee As String
Dim rng As Range

Usedrows_Naomi = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Usedrows_voorraad = Sheets("Voorraad").Cells(Rows.Count, 2).End(xlUp).Row
Curr_employee = ActiveSheet.Name

    With ActiveSheet.Cells(2, 11)
    .Value = "Done"
    .AutoFill destination:=ActiveSheet.Range(Cells(2, 11), Cells(Usedrows_Naomi, 11))
    End With
    With ThisWorkbook.Sheets("Voorraad").Cells(2, 17)
    .FormulaR1C1 = "=Done"
    .AutoFill destination:=Range(Cells(2, 17), Cells(Usedrows_voorraad, 17))
    End With
    With Cells(2, 18)
    .FormulaR1C1 = "=Done_Naomi”
    .AutoFill destination:=Sheets("voorraad").Range(Cells(2, 18), Cells(Usedrows_voorraad, 18))
    End With
    Sheets("Voorraad").Range("R2").FormulaR1C1 = "=Done_Naomi"
    ThisWorkbook.Sheets("Voorraad").Cells(2, 17).Activate
    ThisWorkbook.Sheets("Voorraad").Range(Cells(2, 17), Cells(Usedrows_voorraad, 18)).AutoFill destination:=Range(Cells(2, 17), Cells(Usedrows_voorraad, 18)), Type:=xlFillDefault
    Sheets("Voorraad").Cells(2, 18).Activate
    ActiveCell.AutoFill destination:=Range(Cells(2, 18), Cells(Usedrows_voorraad, 18)), Type:=xlFillDefault
    Sheets("Voorraad").Range("Q:R").Copy
    Sheets("Voorraad").Columns("P:Q").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Naomi").Columns("A:K").ClearContents

End Sub
 
Code:
With Sheets("Voorraad")
      With .Cells(2, 17)
        .value = "=Done"
        .AutoFill .Resize(Usedrows_voorraad - 1)
      End With
      With .Cells(2, 18)
        .value = "=Done_Naomi"
        .AutoFill .Resize(Usedrows_voorraad - 1)
      End With
    End With
 
Geweldig, dankjewel! Er is nog iets waar ik tegen aan liep. :D

Code:
Dim Curr_employee As String
Curr_employee = ActiveSheet.Name

Deze macro wordt aangeroepen vanuit een persoonlijk werkblad van de medewerker. De naam van dit werkblad wil ik later nog naar refereren. Maar omdat de macro ondertussen sheet Voorraad heeft geselecteerd is deze waarde veranderd in Voorraad. Met de method Byval kan je de waarde vastzetten op de oorspronkelijke waarde. Hoe kan functie byval ik dat in deze variabele verwerken? Ik blijf maar errors krijgen in de verschillende syntaxes die ik probeer.
 
Zo, ik wilde de naam in deze formule laten afhangen van het werkblad van waaruit de macro aangeroepen wordt.

Code:
    With Cells(2, 18)
    .FormulaR1C1 = "=Done_" & Curr_employee
    .AutoFill destination:=Sheets("voorraad").Range(Cells(2, 18), Cells(Usedrows_voorraad, 18))


Sub Done_Naomi()
'
' Done_Naomi Macro
'
' Sneltoets: Ctrl+uu
'
Dim Usedrows_Naomi As Integer
Dim Usedrows_voorraad As Integer
Dim Curr_employee As String

Usedrows_Naomi = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Usedrows_voorraad = Sheets("Voorraad").Cells(Rows.Count, 2).End(xlUp).Row
Curr_employee = ActiveSheet.Name

    With ActiveSheet.Cells(2, 11)
    .Value = "Done"
    .AutoFill destination:=ActiveSheet.Range(Cells(2, 11), Cells(Usedrows_Naomi, 11))
    End With
    With Sheets("Voorraad")
    With Cells(2, 17)
    .FormulaR1C1 = "=Done"
    .AutoFill destination:=Range(Cells(2, 17), Cells(Usedrows_voorraad, 17))
    End With
    With Cells(2, 18)
    .FormulaR1C1 = "=Done_" & Curr_employee
    .AutoFill destination:=Sheets("voorraad").Range(Cells(2, 18), Cells(Usedrows_voorraad, 18))
    End With
    End With
    Columns("Q:R").Copy
    Columns("P:Q").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Naomi").Columns("A:K").ClearContents
    ThisWorkbook.Sheets("Voorraad").Cells(2, 17).Activate
    ThisWorkbook.Sheets("Voorraad").Range(Cells(2, 17), Cells(Usedrows_voorraad, 18)).AutoFill destination:=Range(Cells(2, 17), Cells(Usedrows_voorraad, 18)), Type:=xlFillDefault
    Sheets("Voorraad").Cells(2, 18).Activate
    ActiveCell.AutoFill destination:=Range(Cells(2, 18), Cells(Usedrows_voorraad, 18)), Type:=xlFillDefault
    Sheets("Voorraad").Range("Q:R").Copy
    Sheets("Voorraad").Columns("P:Q").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Naomi").Columns("A:K").ClearContents

End Sub
 
Gaat toch goed als je de macro vanuit de sheet 'Naomi' start? Wat is verder de bedoeling van dit bestand? (is wel erg traag)
 
veel onnodige macro's zitten erin, ik moet ze herschrijven, en kan met deze macro heel wat onnodige macro's verwijderen. Dan denk ik dat het weer stuk sneller werkt. Nadat de code het gedeelde with sheets("Voorraad") is gepasseerd veranderd de waarde van Curr_emloyee in Voorraad, terwijl ik wil dat die waarde op Naomi blijft staan.
 
sorry, deze vraag was misschien niet nodig. volgens mij veranderd de waarde van variabele Curr_employee niet tenzij je deze opnieuw laat berekenen nadat je een ander tabblad selecteert. Als ik een ander specifiek voorbeeld heb waar ik de functie Byval nodig heb kom ik nog wel terug. Tot zover bedankt voor je moeite!
 
De hele code maar een beetje aangepast.

Code:
Sub Done_Naomi()
  Application.Calculation = xlManual
  With ActiveSheet.Cells(2, 11)
    .value = "Done"
    .AutoFill .Resize(Cells(Rows.Count, 1).End(xlUp).Row - 1)
  End With
  With Sheets("Voorraad").Cells(2, 17).Resize(, 2)
    .value = Array("=Done", "=Done_" & ActiveSheet.Name)
    .AutoFill .Resize(.Parent.Cells(Rows.Count, 2).End(xlUp).Row - 1)
    Application.Calculation = xlAutomatic
    .Offset(, -1).Resize(.Parent.Cells(Rows.Count, 2).End(xlUp).Row - 1).value = .Resize(.Parent.Cells(Rows.Count, 2).End(xlUp).Row - 1).value
  End With
  Cells(1).CurrentRegion.ClearContents
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan