Avatar billede M_M Mester
07. marts 2016 - 23:57 Der er 8 kommentarer og
1 løsning

Dynamisk kolonnevalg og efterfølgende søg/erstat af faste værdier i samme kolonne, uanset skiftende ark og tomme celler.

Hej. Jeg forsøger at lave en makro, der i et Excel-ark leder efter en bestemt tekst i række 1 (kolonneoverskrift), og så vælger denne kolonne og herefter i denne kolonne erstatter alle forekomster af en defineret tekst med en anden defineret tekst, i selvsamme kolonne erstatter en anden defineret tekst med igen en anden defineret tekst etc. (og hvor så jeg kan kopiere dette mønster mange gange, herunder ændre søg/erstat-teksterne, og tilføje endnu flere til makroen). I tankerne søger jeg altså noget lig med med:

"Find teksten FISK i række 1, og vælg denne kolonne. Herefter i denne kolonne erstat alle forekomster af teksten "450" med teksten "SILD", alle forekomster af teksten "451" med teksten "LAKS", alle forekomster af teksten "670" med teksten "REST" (etc). 

Find teksten "KØD" i række 1, og vælg denne kolonne. Herefter i denne kolonne erstat alle forekomster af teksten "879" med teksten "KO" (etc.)"

Det nærmeste jeg er kommet er her, men jeg har stadig ikke fået noget til at virke: http://stackoverflow.com/questions/16013717/dynamic-column-selection-based-on-column-header-in-vba-excel

Optimalt set ville jeg have en funktion, der fungerer selv:
-    Når teksten man søger efter ikke findes i række 1 (dvs. så går den bare videre uden fejlmeddelse)
-    Der er tomme celler mellem data'ene (dvs. at den ikke kun erstatter ned til næste tomme celle kolonnen). Ellers skal de tomme celler i næstbedste tilfælde erstattes med f.eks. en *, så man sikrer makroen virker på hele kolonnen.
-    Uanset hvor stort arket er (dvs. forskellige antal kolonner/rækker, dog vil flest faktisk altid være i første række og første kolonne, så kunne evt. tælle her via Crtl-pile)
-    Uanset hvad arket hedder (Om det hedder Ark1, Data, Samlet eller andet)

Sagen er, at jeg arbejder med flere forskellige Excel-ark, hvor jeg når der er en specifik kolonneoverskrift i nogle af kolonnerne i disse kolonner skal erstatte alle forekomster af visse specifikke tekster med andre angivne tekster. Men det er ikke altid at alle kolonner findes i arkene, og rækkefølgen for kolonnerne kan også ændres. 

Jeg er næsten helt ny indenfor VBA (netop gået i gang med at lære), så vil blive glad for noget der kan kopieres direkte ind i en makro uden tilvirkning:-) Jeg tænker også, at denne funktion er noget mange bør kunne bruge. Jeg håber nogle vil synes det er spændende at undersøge, hvor langt man kan nå i denne opgave - evt. med brugervenligt kode som fungerer på tværs af arknavne, -størrelser etc., og som mange måske vil kunne bruge:-)
Avatar billede kim1a Ekspert
08. marts 2016 - 09:30 #1
Der er flere ting at tage stilling til:
Står du i det ark som den skal erstatte i? Eller skal den gennemsøge hele projektmappen og dermed alle faneblade?
Når der er tomme celler i den række du omtaler går jeg ud fra der er andre celler i samme række som dog har data, og derfor kan man arbejde med en range? Eller vil du bare have den til at gå igennem samtlige rækker (ca 1 mio = langsommelig)

Jeg tror iøvrigt du vil lære mere af at få dele af programmeringen og så eksperimentere, men jeg har god forståelse for at du gerne vil have noget der virker med det samme.

For at få celle adressen på en bestemt kolonne overskrift (nb søger kun til kolonne EE)
Application.WorksheetFunction.Match("Fisk", Range("A1:EE1"), 0)

Derefter kunne en løsning være at søge igennem hver række i den kolonne, men måske der er en anden kolonne som har data i alle rækker, og således kan give os nederste linje, så vi ikke søger for meget igennem.

Vi har derfor brug for en del flere informationer inden vi kan skrive en komplet makro til dig.
Avatar billede M_M Mester
08. marts 2016 - 11:10 #2
Hej. Tak for opfølgende spørgsmål. Hermed svar:-): Ja, jeg står altid i det ark det drejer sig om. Ja, i hver række er der altid celler med data, så man kan arbejde med range - bemærk at række 1 og kolonne A er altid med data i alle celler og også samtidig de længste rækker/kolonner med data, så de bør kunne definere et range, dvs så man kan stoppe søgningen her. Jeg er i gang med at forsøge at lære, men strander næsten bare der mangler et tegn så forstår ikke så meget endnu, derfor håber jeg på en fungerende makro på dette meget tidlige tidspunkt i min læringskurve😉
Avatar billede kim1a Ekspert
08. marts 2016 - 11:28 #3
Det slår mig at det blot er en søg og erstat, så jeg optog denne handling. Jeg er lidt i tvivl om vi skal have en "on error resume next" ind, men det kan du nok fortælle mig (hvis nu forkomsten 450 f.eks. ikke eksisterer)

Sub Macro1()

Dim StrKolonne As Long
StrKolonne = Application.WorksheetFunction.Match("Fisk", Range("A1:EE1"), 0)
    Columns(StrKolonne).Select
    Selection.Replace What:="450", Replacement:="SILD", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="451", Replacement:="LAKS", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub
Avatar billede M_M Mester
08. marts 2016 - 17:41 #4
Tak for input. Med denne makro får jeg desværre en fejl:
"Run-time error '1004": Kan ikke angive egenskaben Match for klassen WorksheetFunction.
Avatar billede kim1a Ekspert
08. marts 2016 - 18:03 #5
Og du har tilrettet så der enten står Fisk i en overskrift i række 1, eller også rettet fisk til det du skal bruge?

Den virker her hos mig.
Avatar billede M_M Mester
08. marts 2016 - 19:49 #6
Du har ret i, at jeg ikke havde nævnt Fisk i en overskrift - ellers må jeg sige den virker rigtig godt:-) For jeg har ofte ark, hvor ikke alle kolonner er i:-) Det var dog også en af mine håb at få en makro, der går videre til næste skridt, når den ikke finder noget - og det kan jeg se du allerede har tænkt ind i din kommentar om en "on error resume next". Så hvis du kan inkludere det i makroen kan jeg kun sige tak:-)
Avatar billede kim1a Ekspert
08. marts 2016 - 20:20 #7
OKay, så set den således ud (her med to eksempler) - du kan selv indsætte flere.

Sub Macro1()

On Error Resume Next

Dim StrKolonne As Long
StrKolonne = Application.WorksheetFunction.Match("Fisk", Range("A1:EE1"), 0)
    Columns(StrKolonne).Select
    Selection.Replace What:="450", Replacement:="SILD", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="451", Replacement:="LAKS", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

Dim strkolonne2 As Long
strkolonne2 = Application.WorksheetFunction.Match("Kat", Range("A1:EE1"), 0)
    Columns(strkolonne2).Select
    Selection.Replace What:="450", Replacement:="SILD", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="451", Replacement:="LAKS", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

End Sub
Avatar billede M_M Mester
08. marts 2016 - 21:26 #8
Perfekt, takker og bukker. Jeg havde tidligere også prøvet at indsætte et ekstra eksempel - og det virkede også selv om jeg havde kopieret StrKolonne og ikke navngivet dette ord fortløbende som ovenstående (strkolonne2). Så jeg er i tvivl om hvorvidt disse to metoder giver nogen reel forskel? Men ihvertfald mange tak - lige hvad jeg søgte:-)
Avatar billede kim1a Ekspert
08. marts 2016 - 23:26 #9
Nej reelt set giver det ingen forskel, når makroen løbes igennem omdøbes variablen løbende, men det er nok lidt god skik at have en variabel pr kolonne - især hvis du senere hen opdager at der er mere du vil gøre i hver kolonne.
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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