Avatar billede karina1971 Seniormester
17. august 2017 - 09:16 Der er 28 kommentarer og
3 løsninger

VBA - Makroindspilning

Jeg vil gerne indspille en makro, der kan lave en konverteringsopgave, men ved ikke hvordan man gør:

Ark 1:
Kolonne A: her indsættes manuelt en række konkurrentvarenumre
Kolonne B: skal vise leverandørnavn
Kolonne C: skal vise vores varenummer, alternativ A
Kolonne D: skal vise vores varetekst, alternativ A
Kolonne E: skal vise vores varenummer, alternativ B
Kolonne F: skal vise vores varetekst, alternativ B
Kolonne G: skal vise varegruppe

Ark 2 indeholder:
Kolonne A: konkurrentvarenummer
Kolonne B: konkurrentvarenummer uden mellemrum, bindestreger m.m.
Kolonne C: konkurrentvaretekst
Kolonne D: varegruppe
Kolonne E: vores varenr., alt A
Kolonne F: vores varetekst, alt. A
Kolonne G: vores varenr., alt. B
Kolonne H: vores varenr., alt B
Kolonne I: navn på leverandør
Avatar billede andyness Juniormester
17. august 2017 - 09:44 #1
Mon ikke du kan undgå at lave en macro ved blot at lave nogle LOPSLAG-formler?
Avatar billede supertekst Ekspert
17. august 2017 - 10:04 #2
Kunne du evt. uploade et eksempel?
Det kunne evt. være nødvendigt at programmere direkte i VBA og ikke via indspilning.
Avatar billede karina1971 Seniormester
17. august 2017 - 11:17 #3
@andyness - den oprindelige fil er meget stor og løsningen med LOPSLAG bliver for "tung" at arbejde med.

@supertekst - jeg kan ikke se, hvor jeg kan uploade en fil?
Avatar billede andyness Juniormester
17. august 2017 - 11:31 #4
Ok, ja, så er en macro med en event nok løsningen. Hvis filen ligger i en dropbox-mappe, kan du evt. dele filen med et link her.
Avatar billede karina1971 Seniormester
17. august 2017 - 11:54 #5
Avatar billede Jan Hansen Ekspert
17. august 2017 - 12:01 #6
nogen god grund til du vil bruge en knap til konvertering?

Jan
Avatar billede karina1971 Seniormester
17. august 2017 - 12:35 #7
Ikke nødvendigvis......
Avatar billede Jan Hansen Ekspert
17. august 2017 - 14:08 #8
prøv om du kan bruge denne løsning

den henter i via vba hver gang du forlader en celle i kolonne A

https://www.dropbox.com/s/goke8xmsw2voet1/Konvertering%20-%20test%20%281%29.xlsm?dl=0
Avatar billede karina1971 Seniormester
17. august 2017 - 14:48 #9
Umiddelbart virker det - men kun hvis jeg indsætter ind nummer ad gangen. Jeg har brug for at kunne copy/paste en række numre på én gang.

Kan det lade sig gøre, at værdien, der bliver returneret tager udgangspunkt i både kolonne A (Konk varenr) og Kolonne B (Varenumre u/mellemrum) fra arket "Komplet konvertering"

I kolonne A står varenummeret helt originalt. I kolonne B vil mellemrum mm være fjernet. Det kan ikke ses i filen, jeg uploadede da varenumrene er ens i de to kolonner, men et ex. kan være:

Kolonne A 03425  005 50
Kolonne B 3425

Således at det ikke gør nogen forskel, om jeg taster 03425  005 50 eller 3425 i kolonne A på arket "konvertering".
Avatar billede Jan Hansen Ekspert
17. august 2017 - 15:36 #10
1. Ja  så bliver den måske lidt langsomre
2. Ja
Skal jeg prøve at lave en løsning?

Jan
Avatar billede Jan Hansen Ekspert
17. august 2017 - 16:06 #11
Kode til konverterings-arkets modul


Option Explicit
Dim ws As Worksheet, wsData As Worksheet
Dim Area As Range, wsArea As Range, Rcell As Range


Private Sub Worksheet_Change(ByVal Target As Range)
    Dim MyArray()
    Set ws = ActiveSheet
    Set wsArea = ws.Range("A3")
    If Not wsArea.Offset(1, 0).Value = "" Then Set wsArea = Range(wsArea, wsArea.End(xlDown))
    Set wsData = Sheets("Komplet konvertering")
    Set Area = wsData.UsedRange
    Set Area = Area.Offset(2, 0)
    MyArray = Area

    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        For Each Rcell In wsArea
            Dim iRow As Integer
            For iRow = 1 To UBound(MyArray, 1)
                If MyArray(iRow, 2) = Rcell.Value Or MyArray(iRow, 1) = Rcell.Value Then
                    ws.Cells(Rcell.Row, 5) = MyArray(iRow, 2)
                    ws.Cells(Rcell.Row, 6) = MyArray(iRow, 4)
                    ws.Cells(Rcell.Row, 7) = MyArray(iRow, 10)
                    ws.Cells(Rcell.Row, 8) = MyArray(iRow, 5)
                    ws.Cells(Rcell.Row, 9) = MyArray(iRow, 6)
                    ws.Cells(Rcell.Row, 10) = MyArray(iRow, 8)
                    ws.Cells(Rcell.Row, 11) = MyArray(iRow, 9)
                End If
            Next
        Next
    End If

End Sub


Kode til modul (Makro)


Sub SletData()
    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim rCol As Range:
    Set rCol = ws.UsedRange
    Set rCol = rCol.Offset(2, 0)
    rCol.Value = ""
End Sub



Jan
Avatar billede Jan Hansen Ekspert
17. august 2017 - 16:09 #12
du kan også finden den i linket #8
Avatar billede karina1971 Seniormester
17. august 2017 - 18:58 #13
Tusind tak. Det vil jeg forsøge i morgen.
Avatar billede karina1971 Seniormester
18. august 2017 - 09:02 #14
Det ser ud til at virke - fantastisk.....Tusind tak for hjælpen, Jan.

En sidste lille bøn - kan du også hjælpe med at få det til at virke med de ekstra kolonner, jeg har tilføjet i arket "Konvertering"

Kolonne F: Konk. varetekst
Kolonne M: LM varenummer (Billigste alternativ)
Kolonne N: LM varetekst (Billigste alternativ)

Derudover er kolonnen med kundevarenummer slettet

https://drive.google.com/open?id=0BzJ9cIt1onS0ZXFEQmFMZkxqMWM
Avatar billede karina1971 Seniormester
18. august 2017 - 10:02 #15
@Jan - Mit originale ark indeholder ca. 220.000 linjer. Umiddelbart meldes der fejl, hvis jeg forsøger at lave en konvertering, hvor alle linjer tages i brug. Er det for mange linjer?
Avatar billede supertekst Ekspert
18. august 2017 - 10:16 #16
Et bud:

If Not Intersect(Target, Range("A:A")) Is Nothing Then
        For Each Rcell In wsArea
            Dim iRow As Integer <<<<< kunne lyde som om Integer skal rettes til: Long
Avatar billede Jan Hansen Ekspert
18. august 2017 - 11:20 #17
Prøv :
https://www.dropbox.com/s/1j0dxmscqpa9z4t/kopi%20af%20konvertering%20-%20test%20.xlsm?dl=0


Option Explicit
Dim ws As Worksheet, wsData As Worksheet
Dim Area As Range, wsArea As Range, Rcell As Range


Private Sub Worksheet_Change(ByVal Target As Range)
    Dim MyArray()
    Set ws = ActiveSheet
    Set wsArea = ws.Range("A3")
    If Not wsArea.Offset(1, 0).Value = "" Then Set wsArea = Range(wsArea, wsArea.End(xlDown))
    Set wsData = Sheets("Komplet konvertering")
    Set Area = wsData.UsedRange
    Set Area = Area.Offset(2, 0)
    MyArray = Area

    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        For Each Rcell In wsArea
            Dim iRow As Long
            For iRow = 1 To UBound(MyArray, 1)
                If MyArray(iRow, 2) = Rcell.Value Or MyArray(iRow, 1) = Rcell.Value Then
                    ws.Cells(Rcell.Row, 5) = MyArray(iRow, 2)
                    ws.Cells(Rcell.Row, 6) = MyArray(iRow, 3)
                    ws.Cells(Rcell.Row, 7) = MyArray(iRow, 4)
                    ws.Cells(Rcell.Row, 8) = MyArray(iRow, 11)
                    ws.Cells(Rcell.Row, 9) = MyArray(iRow, 5)
                    ws.Cells(Rcell.Row, 10) = MyArray(iRow, 6)
                    ws.Cells(Rcell.Row, 11) = MyArray(iRow, 7)
                    ws.Cells(Rcell.Row, 12) = MyArray(iRow, 8)
                    ws.Cells(Rcell.Row, 13) = MyArray(iRow, 9)
                    ws.Cells(Rcell.Row, 14) = MyArray(iRow, 10)
                End If
            Next
        Next
    End If

End Sub





Jan
Avatar billede karina1971 Seniormester
18. august 2017 - 12:43 #18
Det virker, Jan - du er sør'me skrap til det her.

Jeg går ikke udfra at, jeg kan gøre noget for at det går hurtigere - udover at reducere antallet af linjer i den komplette konvertering?

Mange tak for hjælpen
Avatar billede Jan Hansen Ekspert
18. august 2017 - 12:49 #19
er det mange linier du copy/paste ?

Jan
Avatar billede karina1971 Seniormester
18. august 2017 - 13:32 #20
Det tager umiddelbart lige lang tid pr linje, uanset om jeg indsætter få eller mange varenumre.

Jeg har fjernet en del leverandører, således at listen er reduceret fra ca. 220.000 linjer til  55.000. Det har ikke ændret på hastigheden. Har lige lavet en lille test

Hvis jeg indsætter 20 varenumre, tager det 2 min.40 sek at køre disse igennem
Avatar billede Jan Hansen Ekspert
18. august 2017 - 13:58 #21
prøv denne (max 100 copy/paste)

https://www.dropbox.com/s/3bsexcscmgngjy1/kopi%20af%20konvertering%20-%20test%202.xlsm?dl=0


Option Explicit
Dim ws As Worksheet, wsData As Worksheet
Dim Area As Range, wsArea As Range, Rcell As Range


Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    Dim MyArray(), wsArray(), lCount As Long, NewArray(1 To 100, 1 To 10), lRow As Long
    Set ws = ActiveSheet
    Set wsArea = ws.Range("A3")
    If Not wsArea.Offset(1, 0).Value = "" Then Set wsArea = Range(wsArea, wsArea.End(xlDown))
    Set wsData = Sheets("Komplet konvertering")
    Set Area = wsData.UsedRange
    Set Area = Area.Offset(2, 0)
    MyArray = Area
    If ws.Range("A3") = "" Then Exit Sub
    wsArray = wsArea
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        For lCount = 1 To UBound(wsArray, 1)
            Dim iRow As Long
            For iRow = 1 To UBound(MyArray, 1)
                If MyArray(iRow, 2) = wsArray(lCount, 1) Or MyArray(iRow, 1) = wsArray(lCount, 1) Then
                    NewArray(lCount, 1) = MyArray(iRow, 2)
                    NewArray(lCount, 2) = MyArray(iRow, 3)
                    NewArray(lCount, 3) = MyArray(iRow, 4)
                    NewArray(lCount, 4) = MyArray(iRow, 11)
                    NewArray(lCount, 5) = MyArray(iRow, 5)
                    NewArray(lCount, 6) = MyArray(iRow, 6)
                    NewArray(lCount, 7) = MyArray(iRow, 7)
                    NewArray(lCount, 8) = MyArray(iRow, 8)
                    NewArray(lCount, 9) = MyArray(iRow, 9)
                    NewArray(lCount, 10) = MyArray(iRow, 10)
                    lRow = lCount + 1
                End If
            Next
        Next
        Dim newArea As Range
        Set newArea = ws.Range("E3", ws.Cells(UBound(NewArray, 1), 10))
        newArea = NewArray
    End If
    Application.ScreenUpdating = True
End Sub




Jan
Avatar billede karina1971 Seniormester
21. august 2017 - 07:24 #22
Er 100 det maksimale?
Avatar billede Jan Hansen Ekspert
21. august 2017 - 07:55 #23
ja sådan jeg har lavet det, er det ikke nok så øg NewArray, kan måske sænke hastigheden ved en stor øgning!

Jan
Avatar billede Jan Hansen Ekspert
21. august 2017 - 07:57 #24
Dim MyArray(), wsArray(), lCount As Long, NewArray(1 To 100, 1 To 10), lRow As Long

.......NewArray(1 To 100.........
Avatar billede karina1971 Seniormester
22. august 2017 - 13:23 #25
Jeg har øget til 2000 og det fungerer med acceptabel hastighed.

Jeg oplever dog, at ikke alle værdier returneres. Værdierne i kolonne G, H, I og J (Komplet konvertering) returneres ikke:

https://drive.google.com/open?id=0BzJ9cIt1onS0R0QtLUxsYVVXOEE
Avatar billede Jan Hansen Ekspert
22. august 2017 - 14:55 #26
ret 5 sidste linie til       
Set newArea = ws.Range("E3", ws.Cells(UBound(NewArray, 1), 14))
så de sidste linier ser således ud

        Set newArea = ws.Range("E3", ws.Cells(UBound(NewArray, 1), 14))
        newArea = NewArray
    End If
    Application.ScreenUpdating = True
End Sub
Avatar billede Jan Hansen Ekspert
22. august 2017 - 14:57 #27
forresten der skal min sættes 2 ind
Avatar billede karina1971 Seniormester
23. august 2017 - 10:28 #28
Det hele virker perfekt. Tusind, tusind tak for hjælpen:-)
Avatar billede karina1971 Seniormester
24. august 2017 - 14:25 #29
Efter at min konverteringsfil har virket fint, melder den nu fejl, når jeg indsætter en stak varenumre: Run-time error '1004'

newArea = NewArray er markeret med gul når jeg går ind i VBA:

      Next
        Dim newArea As Range
        Set newArea = ws.Range("E3", ws.Cells(UBound(NewArray, 1), 14))
        newArea = NewArray
    End If
    Application.ScreenUpdating = True
End Sub
Avatar billede Jan Hansen Ekspert
24. august 2017 - 15:50 #30
Dim MyArray(), wsArray(), lCount As Long, NewArray(1 To 2000, 1 To 10), lRow As Long

tror det er fordi NewArray(1 to 2000,1 to 10) skal være NewArray(1 to 2000,1 to 14)

Jan
Avatar billede karina1971 Seniormester
24. august 2017 - 17:41 #31
Det er korrekt at 10 skulle rettes til 14, men fejlen kommer stadig. Kan dette være problemet:

  NewArray(lCount, 10) = MyArray(iRow, 10)


Option Explicit
Dim ws As Worksheet, wsData As Worksheet
Dim Area As Range, wsArea As Range, Rcell As Range


Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    Dim MyArray(), wsArray(), lCount As Long, NewArray(1 To 2000, 1 To 14), lRow As Long
    Set ws = ActiveSheet
    Set wsArea = ws.Range("A3")
    If Not wsArea.Offset(1, 0).Value = "" Then Set wsArea = Range(wsArea, wsArea.End(xlDown))
    Set wsData = Sheets("Komplet konvertering")
    Set Area = wsData.UsedRange
    Set Area = Area.Offset(2, 0)
    MyArray = Area
    If ws.Range("A3") = "" Then Exit Sub
    wsArray = wsArea
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        For lCount = 1 To UBound(wsArray, 1)
            Dim iRow As Long
            For iRow = 1 To UBound(MyArray, 1)
                If MyArray(iRow, 2) = wsArray(lCount, 1) Or MyArray(iRow, 1) = wsArray(lCount, 1) Then
                    NewArray(lCount, 1) = MyArray(iRow, 2)
                    NewArray(lCount, 2) = MyArray(iRow, 3)
                    NewArray(lCount, 3) = MyArray(iRow, 4)
                    NewArray(lCount, 4) = MyArray(iRow, 11)
                    NewArray(lCount, 5) = MyArray(iRow, 5)
                    NewArray(lCount, 6) = MyArray(iRow, 6)
                    NewArray(lCount, 7) = MyArray(iRow, 7)
                    NewArray(lCount, 8) = MyArray(iRow, 8)
                    NewArray(lCount, 9) = MyArray(iRow, 9)
                    NewArray(lCount, 10) = MyArray(iRow, 10)
                    lRow = lCount + 1
                End If
            Next
        Next
        Dim newArea As Range
        Set newArea = ws.Range("E3", ws.Cells(UBound(NewArray, 1), 14))
        newArea = NewArray
    End If
    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