personstarthumb-up

Excel VBA, skriva text på viss position i textsträng?

348 läst  16 svar

  1. E
    Medlem Nivå 6
    Hej,
    Någon som är haj på VBA kod i Excel?

    Vill få ut en textsträng med information på fasta positioner i strängen men fattar inte hur...

    Som exempel har jag information i fyra olika variabler som jag vill bygga en textsträng av där informationen hamnar på en viss position i strängen enligt nedan och lägga i en cell:

    kundKod = 1234 Pos 1
    artNr = abcd Pos 10
    orderNr = 456789 Pos 20
    datum = 20171222 Pos 30

    På position 50 vill jag hämta info ifrån en cell tex A3

    Resultat i Cell F11:
    1234 abcd 456789 20171222 värde ifrån A3
     
  2. J
    Medlem Nivå 1
    Vet inte om jag förstår frågan men du kan bygga ihop strängar med &, ex ="Kalle " & "och Stina" eller =A1 & " " & B1 beroende på vad du vill bygga ihop.
     
    Nyfniken gillar
  3. Nyfniken
    Medlem · Nivå 16
    Eller om du vill dela upp en sträng så använder du funktionerna
    SÖK()
    VÄNSTER()
    HÖGER()
    LÄNGD()
     
  4. E
    Medlem Nivå 6
    Jag begriper knappt frågan själv... men jag vill bygga ihop strängen som du föreslår men vill att de skall hamna på viss förutbestämd position.

    Om jag tar ditt exempel på namn och skriver Kalle på position 1 och Stina på position 10 så blir det fyra mellanslag mellan Kalle___Stina men vill jag ha samma följ på nästa rad med Per och Stina så blir det sex mellanslag för att Stina skall hamna på samma position.

    Skall läsa in information i affärssystemet och då skall informationen ligga på ett visst sätt och eftersom antal och ordernummer kan skifta i längd så hamnar inte informationen på samma ställe tex:

    CSG KUNDKOD PORT FORRAD
    ARD ARTIKEL ORDERNR PORT
    DEL 170428 100 1ORDERNR
    DEL 170502 100 1ORDERNR
    PDN FOLJNR 170424100
     
  5. Nyfniken
    Medlem · Nivå 16
    Jag är osäker men går det inte att göra en export till textfil med fasta kolumnbredder?
     
  6. Nyfniken
    Medlem · Nivå 16
    Ett alternativ är att lägga ihop din cell med en annan med 10 mellanslag. Sen klipper du av resultatet efter 10 tecken. Det komm ier funka.

    "=vänster (a1&" ";10)"

    (Med 10 mellanslag på rad i parentesen)
     
  7. J
    Medlem Nivå 1
    Ja, det var ju kreativt. Men borde du inte ha... jaha, det du skrev visades inte korrekt förrän jag tryckte svara. :) (mellanslagen försvann)

    Om man vill ha ett makro kan man ju räkna ordet med Len och sedan bygga på mellanslag i en loop innan man tar nästa ord, men jag gillade det andra svaret mer.
     
  8. E
    Medlem Nivå 6
    Kanon, nu har jag ett par bra uppslag att jobba med! :)
     
  9. K
    Medlem Nivå 6
    Om jag förstår dig rätt,

    Hämta värde i en cell, nedan i "I6";
    CaseNumber = ActiveSheet.Range("I6").Value

    Använd "mid" för att välja första position samt hur många steg som ska läsas från första positionen i "Casenumber", t.ex nedan där text/tecken läses från position 2 och 10 steg framåt:

    Sliced = mid(CaseNumber,2,10)

    Skriv ut värdet av "Sliced" med;
    ActiveSheet.Range("J8") = Sliced
     
  10. M
    Medlem Nivå 10
    Och vill du ha allt i en variabel för struktur och logik, så kan du konkatenera värdena till en variabel:

    Dim minVariabel
    minVariabel = minVariabel & Sliced
     
  11. E
    Medlem Nivå 6
    Ja det känns som det är en sådan här funktion jag är ute efter fast precis tvärtom :) nu hämtades informationen ifrån viss position i cellen/strängen och jag behöver nu skriva ut den på viss position.

    Sliced1 = mid(CaseNumber,2,10)
    Sliced2 = mid(CaseNumber,20,30)
    Sliced3 = mid(CaseNumber,50,70)

    Vill nu ha ut värdet i tur och ordning för Sliced 1,2,3 i följd i samma cell med start på tex pos 2, 20, 50 även om Sliced 1,2,3 byter längd
     
  12. E
    Medlem Nivå 6
    I underlaget jag har för filformatet står tex att Kundens artikelnummer får bestå av 35 tecken och starta på plats 5, Kundens ordernummer får bestå av 17 tecken och starta på plats 40 men varken artikelnummer eller ordernummer är lika långa ifrån gång till annan.
     
  13. M
    Medlem Nivå 10
    Om jag förstår rätt nu då - med position så menar du antal tecken från vänster räknat?
    Är detta för att veta när ett specifikt värde börjar?

    I så fall, så skulle jag istället titta på kommaseparation istället, vilket gör det mycket enklare att hantera värden av olika längd. Så kallat CSV-format.

    T ex ”värde1,värde2,värde3” osv. Om man då bryter upp den strängen baserat på kommatecknet så får man ut alla värden ett och ett oavsett längd.
     
  14. M
    Medlem Nivå 10
    Ah nu såg jag - du har ingen möjlighet att hantera avgränsande symbol själv utan är styrd av affärsystemet, ett tämligen dumt sådant dessutom. Då blir det krångligare...
     
  15. M
    Medlem Nivå 10
    Se det här lite som pseudokod, men något åt det här hållet måste det bli:

    Result = value1

    // Lägg till de mellanslag som saknas för att nå position 9. Nästa värde börjar då på position 10

    For i=0 to 9-ubound(Result)
    Result = Result & ” ”
    Next

    Result = Result & value2

    //mellanslag för att komma på position 19
    For i=0 to 19-ubound(Result)
    Result = Result & ” ”
    Next

    Result = value3
     
Taggar: excel, macro, vba

Hej där! Skaffa ett konto gratis så kan du också ställa frågor i forumet. :love: