Avatar billede Chris_S Nybegynder
24. maj 2012 - 16:20 Der er 22 kommentarer og
1 løsning

Ændre celleværdi med VBA

Hej Eksperter

Jeg skal have lavet en koder der kan følgende ud fra eksemplet nedenunder:

1    a    b    c    d
2        Tomat    Agurk    Løg
3    Thomas    1        1
4    Jens    1    1   
5    Niels    1    1    1
6    Hans        1   
7    Peter    1        1


Jeg skal have erstattet 1'tallene med den respektive overskrift.

Eks: Thomas  Tomat  Løg
    Jens    Tomat  Agurk
osv.

- Chris
Avatar billede Chris_S Nybegynder
24. maj 2012 - 16:24 #1
Hmm eksemplet ser lidt rodet ud. Hvis I ikke kan hitte ud af det ligger excelarket her: http://dl.dropbox.com/u/39834771/Eksempel.xlsx
Avatar billede store-morten Ekspert
24. maj 2012 - 17:42 #2
Celle E1= tom, så prøv:
Sub Udskift1()
Dim kb As String, rk As Long, kl As Long
Application.ScreenUpdating = False
Range("B1").Select

Igen:
    kb = Mid(ActiveCell.Address, 2, InStr(2, ActiveCell.Address, "$") - 2)
    rk = ActiveSheet.Range(kb & "65536").End(xlUp).Row
    kl = ActiveCell.Column
   
    ActiveSheet.Range(kb & "1").AutoFilter Field:=kl, Criteria1:="1"
    Range(kb & "1").Copy Destination:=Range(ActiveCell.Address & ":" & kb & rk)
    Application.CutCopyMode = False
    Selection.AutoFilter
    ActiveCell.Offset(0, 1).Select
   
    If ActiveCell <> "" Then GoTo Igen
   
Range("A1").Select
Application.ScreenUpdating = True
End Sub
Avatar billede Chris_S Nybegynder
24. maj 2012 - 20:13 #3
Hej store-morten

Det virker 98 % efter hensigten.

Jeg har linket til resultatet af koden, og som du kan se, sker der en fejl i kolonne B.

http://dl.dropbox.com/u/58471064/Eksempel2.xlsx

Jeg tillader mig at komme med et mere ønske til funktionen af koden. Jeg ønsker at efter den første del som din kode "næsten" løser, skal celler med indhold "fyldes op" fra venstre og ud, uanset overskrifterne i række 1. Har også illustreret det i linket).

PS Hvad mener du med E1=tom? Det ser ud at koden virker fra B1 og helt ud vandret og hel ned lodret!

-Chris
Avatar billede store-morten Ekspert
24. maj 2012 - 20:17 #4
Ja, når en celle til højre er "tom" stopper makroen ;-)

Så kan du udvide din "Tabel" med flere kolonner, bare der kommer en tom celle i række 1
Avatar billede store-morten Ekspert
24. maj 2012 - 20:28 #5
Der må ikke være tomme "Navne celler" i kolonne A

Kan det undgås?
Evt. med "Tom" eller tast ' tegnet og et mellemrum.
Avatar billede Chris_S Nybegynder
24. maj 2012 - 20:43 #6
Det er slet ikke noget problem. Så er der bare den lille fejl i kolonne B og så mit ekstra ønske :) Fedt hvis du også har løsningen på det :)
Avatar billede store-morten Ekspert
24. maj 2012 - 21:34 #7
Sub Udskift1()
Dim kb As String, rk As Long, kl As Long
Application.ScreenUpdating = False
Range("B1").Select

Igen:
    kb = Mid(ActiveCell.Address, 2, InStr(2, ActiveCell.Address, "$") - 2)
    rk = ActiveSheet.Range(kb & "65536").End(xlUp).Row
    kl = ActiveCell.Column
   
    ActiveSheet.Range(kb & "1").AutoFilter Field:=kl, Criteria1:="1"
    Range(kb & "1").Copy Destination:=Range(ActiveCell.Address & ":" & kb & rk)
    Application.CutCopyMode = False
    Selection.AutoFilter
    ActiveCell.Offset(0, 1).Select
   
    If ActiveCell <> "" Then GoTo Igen
   
    Range("B2" & ":" & ActiveSheet.Range("D65536").End(xlUp).Address).Select
        For Each c In Selection.Cells
            If c.Offset(0, -1).Value = "" Then
                c.Offset(0, -1).Value = c.Value
                c.Value = ""
            End If
        Next c
   
Range("A1").Select
Application.ScreenUpdating = True
End Sub
Avatar billede store-morten Ekspert
24. maj 2012 - 22:11 #8
Så tror jeg den er der ;-)

Der må ikke være tomme "Navne celler" i kolonne A
Løser "den lille fejl i kolonne B"

Sub Udskift1()
Dim kb As String, rk As Long, kl As Long
Application.ScreenUpdating = False
Range("B1").Select

Igen:
    kb = Mid(ActiveCell.Address, 2, InStr(2, ActiveCell.Address, "$") - 2)
    rk = ActiveSheet.Range(kb & "65536").End(xlUp).Row
    kl = ActiveCell.Column
   
    ActiveSheet.Range(kb & "1").AutoFilter Field:=kl, Criteria1:="1"
    Range(kb & "1").Copy Destination:=Range(ActiveCell.Address & ":" & kb & rk)
    Application.CutCopyMode = False
    Selection.AutoFilter
    ActiveCell.Offset(0, 1).Select
   
    If ActiveCell <> "" Then GoTo Igen
   
    ActiveCell.Offset(0, -1).Select
    Slut = Mid(ActiveCell.Address, 2, InStr(2, ActiveCell.Address, "$") - 2)
   
    Range("B2" & ":" & ActiveSheet.Range(Slut & "65536").End(xlUp).Address).Select
        For Each c In Selection.Cells
            If c.Offset(0, -1).Value = "" Then
                c.Offset(0, -1).Value = c.Value
                c.Value = ""
            End If
        Next c
   
Range("A1").Select
Application.ScreenUpdating = True
End Sub
Avatar billede Chris_S Nybegynder
24. maj 2012 - 22:21 #9
Problemet som jeg nævnte omkring kolonne B er ikke et problem alligevel da der i A heller ikke vil opstå tomme felter.

Men angående det med at "fylde op" fra venstre virker koden ikke helt, den flytter kun 1 celle til venstre hvis denne er tom. Nogle steder vil der være to ++ tomme celler til venstre, som skal fyldes op (altså måske rykkes 3 celler til venstre hvis disse er tomme). Måske der skal køres noget loop? Men min evne rækker ikke helt dertil endnu.

Jeg er super glad for at du vil hjælpe!

-Chris
Avatar billede store-morten Ekspert
24. maj 2012 - 23:39 #10
Prøver igen
Sub Udskift1()
Dim kb As String, rk As Long, kl As Long
Application.ScreenUpdating = False
Range("B1").Select

Igen:
    kb = Mid(ActiveCell.Address, 2, InStr(2, ActiveCell.Address, "$") - 2)
    rk = ActiveSheet.Range(kb & "65536").End(xlUp).Row
    kl = ActiveCell.Column
   
    ActiveSheet.Range(kb & "1").AutoFilter Field:=kl, Criteria1:="1"
    Range(kb & "1").Copy Destination:=Range(ActiveCell.Address & ":" & kb & rk)
    Application.CutCopyMode = False
    Selection.AutoFilter
    ActiveCell.Offset(0, 1).Select
   
    If ActiveCell <> "" Then GoTo Igen
   
    Slut = Range("A65536").End(xlUp).Row
    Range("B2" & ":" & kb & Slut).Select
       
Dim Tal As Byte
    Tal = 1
    Do Until Tal = kl

        For Each c In Selection.Cells
            If c.Offset(0, -1).Value = "" Then
                c.Offset(0, -1).Value = c.Value
                c.Value = ""
            End If
        Next c

        Tal = Tal + 1
    Loop
Range("A1").Select
Application.ScreenUpdating = True
End Sub
Avatar billede Chris_S Nybegynder
25. maj 2012 - 09:00 #11
Jeg får et overflow på: Tal = Tal + 1 der gør at Excel går ned når jeg bruger kode i mit store datasæt.

Syntes også der kom noget range define erro omkring

For Each c In Selection.Cells
            If c.Offset(0, -1).Value = "" Then
                c.Offset(0, -1).Value = c.Value
                c.Value = ""
Avatar billede store-morten Ekspert
29. maj 2012 - 18:59 #12
Er der nogen Data til højre for kolonne D ?
Avatar billede store-morten Ekspert
29. maj 2012 - 23:43 #13
Er der nogen formatering i området?
Avatar billede Chris_S Nybegynder
30. maj 2012 - 08:10 #14
Ja, der er data til højre for kolonne D. En af mine ark går fra A1:CG1073, og størrelsen kan godt sving fra ark til ark.


Overskrifter og Navne er formateret som tekst. "1'tallene" er formateret som brugerdefineret:#.##0;-#.##0;#,##0;@
Avatar billede Chris_S Nybegynder
31. maj 2012 - 16:21 #15
Tror du der findes en løsning på det?

Det vil være så vigtigt for mig hvis det kommer itl at virke.

Koden virker præcis efter hensigten hvis den køres på et lille datasæt.
Avatar billede store-morten Ekspert
31. maj 2012 - 17:19 #16
Sub Udskift1()
Dim kb As String, rk As Long, kl As Long
Application.ScreenUpdating = False
Range("B1").Select

Igen:
    kb = Mid(ActiveCell.Address, 2, InStr(2, ActiveCell.Address, "$") - 2)
    rk = ActiveSheet.Range(kb & "65536").End(xlUp).Row
    kl = ActiveCell.Column
   
    ActiveSheet.Range(kb & "1").AutoFilter Field:=kl, Criteria1:="1"
    Range(kb & "1").Copy Destination:=Range(ActiveCell.Address & ":" & kb & rk)
    Application.CutCopyMode = False
    Selection.AutoFilter
    ActiveCell.Offset(0, 1).Select
   
    If ActiveCell <> "" Then GoTo Igen
   
    slut = Range("A65536").End(xlUp).Row
    Range("C2" & ":" & kb & slut).Select

        For Each c In Selection.Cells
            If c.Offset(0, -2).Value = "" Then
                c.Offset(0, -2).Value = c.Value
                c.Value = ""
            End If
            If c.Offset(0, -1).Value = "" Then
                c.Offset(0, -1).Value = c.Value
                c.Value = ""
            End If
        Next c

Range("A1").Select
Application.ScreenUpdating = True
End Sub
Avatar billede Chris_S Nybegynder
31. maj 2012 - 22:06 #17
Hej

Excel går stadig ned (svare ikke) når jeg køre det store datasæt. Når jeg tester på et mindre datasæt rykkes de nu kun to pladser til venstre, altså de fylder ikke helt op. Denne del virkede før hvis excel ikke gik ned!
Avatar billede Chris_S Nybegynder
31. maj 2012 - 22:17 #18
Jeg har uploadet et test ark som svare til mit store datasæt, men hvor jeg bare har ændret navne osv.

Håber du kan få det til at virke (og at du foresat vil hjælpe) :)

http://dl.dropbox.com/u/58471064/TEST.xlsm
Avatar billede store-morten Ekspert
31. maj 2012 - 23:10 #19
Jeg har kikket lidt på det :-)

Ændret formater/Layout og lidt kode.

Kik om vi nærmer os.
http://gupl.dk/680170/
Avatar billede store-morten Ekspert
31. maj 2012 - 23:18 #20
Og væk er koden !!!!!
Avatar billede store-morten Ekspert
31. maj 2012 - 23:21 #21
Sættes ind på Ark2

Sub Udskift1()
Dim kb As String, rk As Long, kl As Long
Application.ScreenUpdating = False
Range("B1").Select

Igen:
    kb = Mid(ActiveCell.Address, 2, InStr(2, ActiveCell.Address, "$") - 2)
    rk = ActiveSheet.Range(kb & "65536").End(xlUp).Row
    kl = ActiveCell.Column
   
    ActiveSheet.Range(kb & "1").AutoFilter Field:=kl, Criteria1:="1"
    Range(kb & "1").Copy Destination:=Range(ActiveCell.Address & ":" & kb & rk)
    Application.CutCopyMode = False
    Selection.AutoFilter
    ActiveCell.Offset(0, 1).Select
   
    If ActiveCell <> "" Then GoTo Igen
   
      slut = Range("A65536").End(xlUp).Row
    Range("B2" & ":" & kb & slut).Select
       
    Selection.SpecialCells(xlCellTypeBlanks).Select
    Selection.Delete Shift:=xlToLeft
   
    Range("A1").Copy
    Range("B2" & ":" & kb & slut).Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
       
Range("A1").Select
Application.ScreenUpdating = True
End Sub
Avatar billede Chris_S Nybegynder
01. juni 2012 - 08:28 #22
Det virker. Hvor er det bare fedt. Mange tak for hjælpen. Så kan vi vist lukke tråden. Hvordan får jeg give dine fuldt ud fortjente point?
Avatar billede store-morten Ekspert
01. juni 2012 - 14:18 #23
Velbekomme.

Her er en lille film, hvor du kan se hvordan man "accepter svar":
http://www.youtube.com/watch?v=s26DGiuvXBo
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
Kurser inden for grundlæggende programmering

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