Just nu i M3-nätverket
Jump to content

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


Mikael63
 Share

Go to solution Solved by MH_,

Recommended Posts

Mikael63

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.

 

 

Link to comment
Share on other sites

Mikael63
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.

Link to comment
Share on other sites

=TEXTJOIN("{down}";;A:A)&"{down}"

 

Annars kanske en batscfil/kommandotolk 

https://stackoverflow.com/questions/60034/how-can-you-find-and-replace-text-in-a-file-using-the-windows-command-line-envir

powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt"

Sen behöver du bara lista ut hur Foo skall ändras till ^p  (?char 10?) och Bar till '{down}'

Ehh, och fixa så att du kan bestämma MyFile....

Det kanske är enklast att göra som du gör...

Link to comment
Share on other sites

Hmm, märkvärdigt svårt att kopiera en text-variabel i Excel (om inte värdet ligger i en cell)

 

Nåja, det är väl bara att fuska och lägga in en hjälpcell som klipps bort när du kopierar

Range("AA1").Value = Application.WorksheetFunction.TextJoin("{down}", True, Range("A:A")) & "{down}"
Application.CutCopyMode = xlCut
Range("AA1").Copy

 

Link to comment
Share on other sites

Mikael63
Posted (edited)

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

 

Edited by Mikael63
Link to comment
Share on other sites

Eller också är du lat på riktigt och använder "selection" direkt i formeln

 

Range("AA1").Value = Application.WorksheetFunction.TextJoin("{down}", True, Selection) & "{down}"
Application.CutCopyMode = xlCut
Range("AA1").Copy

 

Det är ju lite irriterande att man tvingas använda "AA1". Men om man Googlar så verkar alla metoder för att kopiera ett värde direkt till urklipp mycket krångligare.

Link to comment
Share on other sites

Mikael63

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!

 

Link to comment
Share on other sites

  • 1 month later...
Mikael63
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..

 

 

Link to comment
Share on other sites

Mikael63

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?

 

Link to comment
Share on other sites

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

[windows]+v ?

 

Du tappade mig för ett bra tag sen...Men varför inte lägga till texten direkt i AA1 innan du kopierar?

 

Och sen spara AA1 till en textfil med hjälp av Open och Print

https://chandoo.org/wp/save-range-as-text-using-vba/

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/open-statement

 

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

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

 

Eller, om du inte skall använda klipp och klistra så behöver du ju inte mellanlanda i A1

Sub tjo()
Dim MinText As String
MinText = MinText
MinText = MinText & "{down}"
MinText = "!^F5::Send," & vbNewLine & MinText

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

 

Link to comment
Share on other sites

Mikael63
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

 

Link to comment
Share on other sites

  • Solution

Det är ju märkligt att man alltid snubblar över sina egna fötter

I andra skriptet skall rad3

MinText = MinText

naturligtvis vara

MinText =  Application.WorksheetFunction.TextJoin("{down}", True, Selection)

Men det har du väl redan listat ut

 

 

>>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.

Markera AA1

Ctrl+1, fliken justering, ta bort krysset för radbrytning

Link to comment
Share on other sites

Mikael63
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.

Link to comment
Share on other sites

Mikael63

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" ;)

 

Link to comment
Share on other sites

  • 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.

 

Edited by Mikael63
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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..

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share



×
×
  • Create New...