Just nu i M3-nätverket
Gå till innehåll

Snabbt söka och ersätta radbrytning med text?


Mikael63
 Share

Rekommendera Poster

I avdelningen "Världens lataste" funderar jag på om det finns ett ännu enklare och snabbare lösning än min nuvarande?

I urklipp har jag text som ex.

1
2
3

alltså text + radbrytning. (Källa är Excel)

Jag startar NoteTab Light eller annan likvärdig bra texteditor.

Väljer Search - Replace.

Fyller i att söka efter radbrytningen, som i denna editor motsvaras av ^P, och ersätta med texten {down}.

Ersätt alla, sök hela dokumentet, OK, markera allt, kopiera till urklipp.

Stänger editorn utan att spara.

Det jag skulle vilja snabba upp är att kunna ha sök ^P ersätt med {down} som en sparad fras att återanvända och den bör då vara förvald redan.

Egentligen behöver jag inte ens "se" vad som händer.

 

 

Länk till kommentar
Dela på andra webbplatser

18 minuter sedan, skrev Monshi:

Notepad++

Minns den från gång till gång vad man sökt och vad man ersatt med?

Fördel webbsidan är att man inte behöver komma ihåg att det är ^P man ska söka efter.

 

Källan är som sagt i Excel och om man med ett makro skulle kunna ta alla värden, där värden finns, i kolumn A och knöla ihop dem, lägga till {down} och sedan lägga allt i urklipp så kan man hoppa över ett helt moment.

101
102
103
201
202
303

i Excel ska bli

101{down}102{down}103{down}201{down}202{down}303{down}

om man ex. klistrar in i ett textdokument.

Länk till kommentar
Dela på andra webbplatser

Postad (redigerade)

Lösningen duger som den är och jag begriper var jag ändrar för att hämta värden från annan kolumn om det skulle vara så men OM man skulle vilja köra detta makro med markerade celler i stället?

"True" kanske kan utgå, jag gissar det är med för att bara ta värden där värden finns men det får man se till själv med markeringen.

"Range A.." blir det Range selection eller blir det bara selection?

Äh, jag testar lite själv, inledande text i första inlägget till trots ;)

 

ed.

Selection.Copy
Range("Z1").Select
ActiveSheet.Paste
Range("AA1").Value = Application.WorksheetFunction.TextJoin("{down}", True, Range("Z:Z")) & "{down}"
Application.CutCopyMode = xlCut
Range("AA1").Copy

 

Redigerad av Mikael63
Länk till kommentar
Dela på andra webbplatser

Tack!

Det som är irriterande är att Excel tömmer Urklipp så snart något annat görs.

Hade Urklipp kunna behålla sitt innehåll hade man kunnat städa AA1 i samma makro, även om det inte gör något om det sparas något där.

 

Hm. det blev ju riktigt bra detta :D

 

Det som kopierats från AA1 ska sedan klistras in i en textfil som sedan AutoHotkey ska använda.

Som jag gör nu så klistrar jag in det i en befintlig fil, som jag har annat i, och efter en textsträng som "redan" innehåller

!^F5::Send, 

Här skulle man ju kunna tänka sig att makrot ser till att denna text kommer först så skulle man kunna klistra in på en "ny" rad.

Dock är inte detta någon större vits om man (=makrot) inte skulle göra på annat sätt i stil med:

Skapa filen C:\temp\filldown.ahk

Klistra in texten ovan + innehållet i AA1

Spara

Kör/"dubbelklicka"

(Här ligger då skriptet och väntar på tangentkombinationen Ctrl+Alt+F5 vilket motsvaras av !^F5)

 

Det kanske funkar men om man vill köra detta en vända till så "körs" redan skriptet och då måste man editera innehållet i C:\temp\filldown.ahk vilket också kan gå bra men för att nya värden ska kunna användas måste skriptet laddas om och det vet jag inte riktigt hur man kan göra "utifrån". Eller om man kan köra Kill på processen?

Makrot får då börja med att ta bort C:\temp\filldown.ahk så att en ny kan skapas, om man inte kan tvinga överskrivning.
Måste undersökas!

 

Länk till kommentar
Dela på andra webbplatser

  • 1 month later...
2021-01-07 15:58, skrev Mikael63:

Här skulle man ju kunna tänka sig att makrot ser till att denna text kommer först så skulle man kunna klistra in på en "ny" rad.

Dock är inte detta någon större vits om man (=makrot) inte skulle göra på annat sätt i stil med:

Skapa filen C:\temp\filldown.ahk

Klistra in texten ovan + innehållet i AA1

Spara

Kör/"dubbelklicka"

(Här ligger då skriptet och väntar på tangentkombinationen Ctrl+Alt+F5 vilket motsvaras av !^F5)

 

Det kanske funkar men om man vill köra detta en vända till så "körs" redan skriptet och då måste man editera innehållet i C:\temp\filldown.ahk vilket också kan gå bra men för att nya värden ska kunna användas måste skriptet laddas om och det vet jag inte riktigt hur man kan göra "utifrån". Eller om man kan köra Kill på processen?

Makrot får då börja med att ta bort C:\temp\filldown.ahk så att en ny kan skapas, om man inte kan tvinga överskrivning.
Måste undersökas!

Tänkte testa detta men det vill sig inte riktigt. Jag testar att spela in makro som öppnar en befintlig fil (får förutsätta att en sådan finns då) men redan nu skulle jag vilja öppna den utan "textimportguiden".

Men fortsätter med den, väljer endera alternativet, slutför.

Tar bort värden, ställer markören i A1, skriver egen text (kan får vara SEND fortsättningsvis) mellanslag, klistrar in det som finns i urklipp, enter, spara, stäng.

Det fungerar men i filen läggs det då till apostrof först och sist. Prövar jag att "spara som" blir det ett .txt i filnamnet.

Jag vill öppna, eller skapa, en fil som heter filldown.ahk.

 

Hur ska jag tänka här, egentligen?

 

Ed. Nä mitt inspelade makro visar bara den text jag hade i urklipp.

Jag skulle behöva, i cell A1 som väl blir första raden, första positionen i ett textdokument, skriva en text mellanslag och paste.

Alternativt kan filen öppnas som "mellanslagsseparerad" och A1 lämnas orörd, i B1 klistras värden in.

Äh, kanske för mycket jobb, jag "måste" även hitta ett sätt att ladda om skriptet..

 

 

Länk till kommentar
Dela på andra webbplatser

Har räknat ut att det är ett kommatecken som stökar till det.

Jag vill ju skriva

!^F5::Send,

i A1 och då blir resultatet i filen

"!^F5::Send,"

Skriver jag bara 

!^F5::Send

utan kommatecken blir resultatet

!^F5::Send

Hur ska jag få med kommatecknet utan att det skapas några snuffar?

 

Länk till kommentar
Dela på andra webbplatser

54 minuter sedan, skrev MH_:

innan du kopierar?

Jo, det skulle ju fungera

 

54 minuter sedan, skrev MH_:

inte mellanlanda

Nej, det behövs ju inte det var bara det att det fungerade så bra "fram dit". Jag har använt detta makro många gånger vi det här laget.

Nu när jag testar den första tjo() skrivs det nya rader vilket det inte gjorde i "original" men resultatfilen verkar bli bra. Dock stökar det ju till AA1 extra mycket.

 

När jag testar den andra tjo() fattas alla värden.

 

Testar att knåpa lite själv.

**

Ed.

Sub EditAhk()
Range("AA1").Value = Application.WorksheetFunction.TextJoin("{down}", True, Selection)
Range("AA1").Value = Range("AA1").Value & "{down}"
Range("AA1").Value = "!^F5::Send," & Range("AA1").Value

Open "C:\temp\filldown.ahk" For Output As #1
    Print #1, Range("AA1").Value
Close #1
Range("AA1").Delete
End Sub

 

Länk till kommentar
Dela på andra webbplatser

9 minuter sedan, skrev MH_:

snubblar

Tack. Tror du postade detta i samma veva som jag redigerade mitt inlägg där jag hittat en lösning.

Men nu ser det skarpa makrot ut så här:

Sub EditAhk()
Dim MinText As String
MinText = Application.WorksheetFunction.TextJoin("{down}", True, Selection)
MinText = MinText & "{down}"
MinText = "!^F5::Send," & MinText

Open "C:\temp\filldown.ahk" For Output As #1
    Print #1, MinText
Close #1
End Sub

Tog bort newline bara.

 

Resultatfilen fungerar också bra att köra/trigga.

Länk till kommentar
Dela på andra webbplatser

Ja, jag menade en ny rad som den enda nya raden, att den gamla skulle skrivas över.

Men bra att jag fick se hur man gjorde den biten, nu ser nämligen koden ut så här:

Sub EditAhk()
Dim MinText As String
MinText = Application.WorksheetFunction.TextJoin("{down}", True, Selection)
MinText = MinText & "{down}"
MinText = "!^F6::Reload" & vbNewLine & "!^F5::Send," & MinText

Open "C:\temp\filldown.ahk" For Output As #1
    Print #1, MinText
Close #1
End Sub

 

En sammanfattning/förklaring för nytillkomna lyssnare kanske:

Ovanstående kod ligger i arbetsboken Egna makron (Personal.xlsb) vilket gör att den är körbar oavsett vilken arbetsbok jag öppnar, även ny tom bok. Jag har kopplat en knapp till makrot, en knapp som finns i fältet Snabbåtkomst.

 

Från "applikation E" klipper jag ut värden som jag klistrar in i en ny arbetsbok.

Där sorterar jag och bearbetar jag dessa värden, sorterar sedan tillbaks till den ursprungliga sorteringen.

Det här är högst olika från gång till gång och går inte att automatisera mera.

 

När jag är klar markerar jag alla värden i den första kolumnen, den första jag vill ta tillbaks värden från.

Klickar på min knapp i Snabbåtkomst.

En fil skapas då enligt "Open" i koden ovan.

Den filen är "körbar" om man har installerat AutoHotkey.

Om jag inte redan har startat den gör jag det nu.

 

Sedan växlar jag tillbaks till "applikation E" igen och ser till att markören är på rätt position.

Sedan trycker jag Ctrl+Alt+F6 för att ladda om skriptet (behövs inte om man nyss startat det) och sedan trycker jag Ctrl+Alt+F5.

AutoHotkey ser då till att allt efter kommatecknet (efter Send) skrivs. {down} betyder pil-ner och markören hoppar då till nästa rad/cell i "applikation E".

(Pil-ner är snällare än ett enter-slag om det skulle vara så att jag kör detta på fel ställe, av misstag)

Behöver jag mata in ytterligare värden markerar jag annat område, klickar på knappen osv.

 

"applikation E" medger inte att man klistrar in något, inte mer än i en cell åt gången. Därav denna lösning, en lösning som underlättat många gånger för mig.

 

Tack än en gång @MH_

 

 

ps. Extra nice hade det ju varit om Excel skulle kunna skriva direkt till "applikation E" ;)

 

Länk till kommentar
Dela på andra webbplatser

  • 6 months later...

Har använt denna lösning många gånger nu, återigen tack!

 

Nu skulle jag önska lite finputsning ;)

Tomma celler ignoreras vilket ger ett felaktigt slutresultat.

Nu kringgår jag detta genom att i källan ersätta tomma celler med något "unikt" som jag sedan kan söka och ersätta med ingenting. Detta medför att jag får välja filter, välja tomma, skriva i första cellen, kopiera neråt, rensa filter. För varje kolumn.

Bra, eller bäst, hade det varit om en tom cell skulle generera en "till" sådan {down}.

 

Går det att lösa tro?

 

Ed. Jag kan ju faktiskt söka efter ingenting och ersätta med __ så slipper jag använda filterfunktionen, men det blir ett moment extra i källan och ett moment extra i det färdiga resultatet.

 

Redigerad av Mikael63
Länk till kommentar
Dela på andra webbplatser

1 timme sedan, skrev Mikael63:

Går det att lösa tro?

Ja, jag lyckades faktiskt klara av någonting själv:

 

Sub EditAhk()
Dim MinText As String
MinText = Application.WorksheetFunction.TextJoin("{down}", False, Selection)
MinText = MinText & "{down}"
MinText = "!^F6::Reload" & vbNewLine & "!^F5::Send," & MinText

Open "C:\temp\filldown.ahk" For Output As #1
    Print #1, MinText
Close #1
End Sub

 

Ett False där det tidigare var True

  • Tack 1
Länk till kommentar
Dela på andra webbplatser

22 minuter sedan, skrev MH_:

Visst är det skönt när saker bestämmer sig för att vara enklare än man trodde...

Ja, fast samtidigt lite snopet..

Länk till kommentar
Dela på andra webbplatser

  • 3 months later...
2021-09-20 09:55, skrev Mikael63:

Har använt denna lösning många gånger nu, återigen tack!

Ja, ännu fler gånger nu, tack igen!

 

2021-09-20 09:55, skrev Mikael63:

Nu skulle jag önska lite finputsning ;)

Ja, igen.

Om jag filtrerar (Autofilter) och markerar cellerna så tas ändå värden med från de rader som är bortfiltrerade.

Går DET att lösa med tro?

Länk till kommentar
Dela på andra webbplatser

 Share

×
×
  • Skapa nytt...