Just nu i M3-nätverket
Jump to content

sökning i Excelfil efter en förekomst av en sträng....


M.Mever

Recommended Posts

Hej

Jag vill söka i en excelfil. jag har gjort en loop förrut som loopar igenom ett antal rader bara och hämtar ut alla värden ifrån kolumn B exempelvis, MEN nu vill jag inte ha denna typen av "sökning/hämtning" utan nu vill jag att den ska hämta värden ifrån en kolumn och sen respektive värde ifrån en annan kolumn... de kolumnerna som det är frågan om är kolumn A och B.

 

jag använder mig utav denna kod för att gå till filen och leta upp tabellen 291.2


Cells.Find(What:=[GRÅ]"291.2"[/GRÅ], After:=ActiveCell, LookIn:=xlValues, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= [color="#0000ff"]False[/color]).Activate

Sen vill jag att funktionen då.. ska leta ENBART i denna tabellen.. efter

produkter i kolumn A, som kan vara C12, C3O, C4F... och sen ska den skriva ut dessa värden i kolumn A i ett annat excelark som heter LP, som inte finns i samma fil.

och saken är den att det finns en sträng "+R" som betyder att det är en tabell som fortsätter under, för att det inte finns plats till höger typ...

så det är värden i kolumnerna C, D E.... sen så fortsätter INTE tabellen i kolumn F, G, H UTAN det går ner under så att det är raderna som skiljer... så jag vill även kunna söka på "+R"... för att se fortsättningen...på värdena...

 

hoppas ni e me på vad jag menar,, annars så får ni fråga, så ska jag försöka förklara bättre...

 

Tacksa för svar

 

M.M

 

 

 

Link to comment
Share on other sites

Mångaproblem har du..

 

Angriper ditt nuvarande ur en liten annan vinkel än du kanske önskar.

 

1: Funderat på att namnge områden istället för att söka efter dem? Kanske inte användbart för dig, men värt att föreslå. En referenscell eller hela tabellen kan du namnge.

 

2: Det du annars nu får göra är att utgå från cellen (?) du hittat. Antar att datat är snyggt uppställt och det finns mellanrum/tomma celler endeast mellan olika tabeller/dataområden och ej inom tabellen (eller ivartfall inga gap i rubriken resp darnamn)

Då kan du från cellen du fått ut vid sökningen nyttja funktioonen End.

Dvs

myCell.End(xlDirection)

där xlDirection är något av

xlDown

xlToRight

xlToLeft

xlUp

 

Detta anrop är exakt samma sak som om du står i cellen och trycker CTRL+Pil.

 

Efter detta anrop bör du veta var tabellen slutar och därmed kunna ringa in hela tabellen samt titta i specifika celler efter exemplevis "+r". Sedan är det "bara" att söka och sedan stega igenom det resultat sökningen givit.

 

MEN du - varför inte en Pivotabell? Kraftfulla och effektiva.

 

OCH missa inte att titta i VBAs hjälp, där finns råd hur du använder Excels sökfunktion.

 

En sista poäng: Missa inte Excels PASSA, INDEX och LetaRad/kolumn. Om du kan nytjja Excels inbyggda formler så är dessa snabbare och robustare än VBA-kod.

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

har aldrig jobbat med varken VBA eller Excel egentligen så jag e väl ingen stjärna.

jag har ju löst det egentligen, genom att "hårdkoda" vilka rader som man ska hämta ut data ifrån, med en FOR loop typ..

 

grejen är att programmet är ganska stort och jag vill inte förändra det övriga... det är inte så att de ligger i olika delar som inte påverkas...

 

det är en väldigt konstig fil egentligen...

som exempelvis... när man väl hittat 291.2.... så finns det i A kolumnen

"* HC/150 HC/160 MK/150" <--- allt inom citat,

finns på en rad i en kolumn... så det är ju en massa mellanrum, en massa tecken... som jag inte vill ha ut... nu har denna raden ovan ingen betydelse...

 

några rader under denna raden så finns det då den informationen som jag vill ha ut, dvs koder/produkter som är C12, C3O, C4O, C4F... som enbart finnns på en rad var, och neråt, och det finns inga andra tecken på den raden som koden finns....

 

kan man bifoga en fil här eller? som du kan kolla i? så att du får se? eller kan man på ngt sätt klippa in en fil... så att det ser ok ut?

 

Link to comment
Share on other sites

såhär ser filen ut i korta drag. Kolumn A innehåller endast koder... typ ETAN, METAN, PROPAN, och varje kod, har en förkortning typ, PROPAN = C3O. och förkortningen är jag intresserad av.... tillsammans med värdet för C3O.

förkortningen finns i Kolumn B, och det vill jag hämta, ALLA förkortningar....till ettt excel ark som heter LP.

 

 

-----------?1--------------?2----------------?3

B----------C--------------D-----------------E

C12----------0,0045--------0,0031----------0,0041

C3O----------0,112---------0,099-----------0,097

C4O----------0,67----------0,65-------------0,63

C3F----------0,00008-------0,00010--------0,00012

C4F----------0,40-----------0,38--------------0,42

*

* <---- dessa är endast kommentarer...

+R <-- markerar fortsättning på tabellen...

*

-----------?4-------------?5-----------------?6

B----------C--------------D-----------------E

C12----------0,0045--------0,0031----------0,0041

C3O----------0,112---------0,099-----------0,097

C4O----------0,67----------0,65-------------0,63

C3F----------0,00008-------0,00010--------0,00012

C4F----------0,40-----------0,38--------------0,42

*

*

+R <-----kan förekomma igen, om fler än 6 modes...

*

 

ni ser ?1--.. ?2--- osv--- detta är olika mode, som man kan köra en maskin på... kör man med Mode 2 så får man ett visst värde (0,0031 av C12) kör man den på mode 6 så får man 0,0041....

 

jag låter användaren mata in vilken mode denne vill köra på... sen så letar jag MELLAN rader i filen...

men nu vill jag utnyttja sökningen av +R.

 

1. jag vill få ut C12, C3O... osv till ett ark i en kolumn med början från rad 6 till rad 25 typ

 

2. jag vill få ut det RÄTTA värdet, med tanke på vilket nummer användaren matar in 1-6.... mha sökning eller dyl efter +R

+R ska ju bara användas om det är högre mode än 3... är mode 1-3 så ska man ju leta innan +R annars tvärtom...

 

 

hoppas ni e me...

tacksam för snabba svar, har suttit med detta ett bra tag nu...

 

M.M

 

 

 

Link to comment
Share on other sites

Det är svårt att lösa hela uppgifter på detta vis, delsteg som "hur söker jag" är enklare.

 

Så jag rekommenderar dig att dela upp ditt problem i så små delar som möjligt, precis som vid all annan programering. Stega dig igenom varje steg, kopier ainget, utan markera exemplevis dina områden du ska söka i eller de värden du hittar att kopiera. När du nått dit är kopieringen enkel.

 

1: Hitta din tabell (via sökning eller via namngivning av vissa celler) (det har du väl gjort?)

2: Med denna bestämda position, bestäm (markera)det cellområde som ska genomsökas.

3: Nu till klurigheten kanske - finna dina önskade

a: Vet du vilken kolumn du ska söka i?

b: Vill du nyttja Find eller kanske formler på arket? Jag rekommenderar nästan formler på arket (om inte en Pivotabell)

c: Leta reda på en cell som matchar ditt kriterium.

c1: Leta då reda på de värden du vill kopiera. och markera dessa

c2: Därefter - leta reda på nästa värde

 

osv.

 

 

Find - kan söka inom explicit givna områden och returnera alla celler som matchar din sökning. Tror jag givit dig detta exempel förut:

[color="#0000ff"]With[/color] Worksheets(1).Range([GRÅ]"a1:a500"[/GRÅ])
    [color="#0000ff"]Set[/color] c = .Find(2, lookin:=xlValues)
    [color="#0000ff"]If[/color] [color="#0000ff"]Not[/color] c Is [color="#0000ff"]Nothing[/color] [color="#0000ff"]Then[/color]
        firstAddress = c.Address
        [color="#0000ff"]Do[/color]
            c.Value = 5
            [color="#0000ff"]Set[/color] c = .FindNext(c)
        [color="#0000ff"]Loop[/color] [color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] c Is [color="#0000ff"]Nothing[/color] [color="#0000ff"]And[/color] c.Address <> firstAddress
    [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]With[/color]

 

Från VBA hjälpen i Excel.

 

Som sista åtgärd, eftersom du verkligen verkar behöva hjälp :) - sänd mig en kopia, eller ett exempel, på hur det kan se ut så kanske jag kan ordna en dellösning åt dig.

 

Min epost står i användarinfon

 

 

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

nu har jag skickat mail.

 

jag vill alltså ha ut produkterna

C12, C3O, C3F, ....., H3*, VG*, R1*, *LSS

 

Sen beroende på om användaren matar in 1 eller 2, 3, 4, 5 eller 6 så ska den gå till RÄTT kolumn (C, D, E) och rätt rad, eftersom det skiljer sig..

 

jag tänkte såhär, jag har ju sökt upp tabellen 291.2 så den CELLEN är markerad för tillfället...

Sen vill jag hämta ut B kolumnen... C12...osv TILL ett excelark.. som heter LP.

 

kan man definera ngt område som man kan söka i ??

när jag ska veta vilka värden jag ska hämta... KAN man söka på ?1, ?2 ...osv???

 

om man lixom får in att användaren vill ha 4, 5, 6 mode.. så kan man kanske söka upp +R... och sen söka efter ?4...osv??

 

 

 

 

 

 

Link to comment
Share on other sites

ough, det där var ett jobbigt utseende på en fil (om man nu kan skriva så).

Inte någon enkel snygg tabell att leta i direkt.

 

Enkel fråga, som egentligen inte påverkar så mycket, men är denan atbell, detta blad statiskt eller kan det förändras? Generas datat på bladet uifrån någon annan applikation?

 

tar mig en titt på det, men lovar ingen mirakellösning.

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

NEJ, denna fil är statiskt... ändras inte

 

ändrade planer... jag skulle vilja göra såhär nu, att jjag söker ju först upp 291.2-.... sen vill jag leta efter efterföljande tabell...

nu fick du enbart tabell 291... men det kommer en ny tabell efter 291.2...

så då skulle mabn kunna söka på smama sätt och söka efter TABLE ordet...

sen på ngt sätt vill jag få ut en range... exempel från rad 73 till 120...

där emellan är det SÖKNINGSSBART

 

sen vill jag helt enkelt söka efter ?1...osv i kolumn C, D, E..

skit i +R

 

du ser ju i filen att ?4,?5,?6 lika gärna kunde vara på kolumn F,G, H

efter ?3... men +R markerar då att tabellen fortsätter nedanför ..

 

 

men filen ska inte påverkas, endast hämta information ur den.

 

jag e tacksam för vilken lösning som helst.

 

 

Me?

 

 

[inlägget ändrat 2005-03-11 09:29:28 av M.Mever]

Link to comment
Share on other sites

Är det denna tabell du jobbat med hela tiden?

Har du själv läst in tabellen i Excel? Även om det inte är så så bör du nog skriva ett makro som snyggar till den först, det vill säga letar upp +R och flyttar informationen så att du har ett sammanhängande kolumnområde för varje tabelldel.

 

När du gjort det så kan du ju fundera på att läsa in hela tabellen i en matris. Om du tex har tabellerna 200.1 till 293.7 så kan du dimensionera en matris som UtData(200 To 293, 7, [Modes], [Antal utdatavärden]). Eller så definierar du en datatyp som du sedan använder i en matris, för att få namngivna utdata variabler.

 

/Pär B

 

Link to comment
Share on other sites

grejen är att det är en hög med .xls filer...

men jag funderar på om man skulle kunna skippa +R och använda sig utav att söka efter ?1..?2...

 

jag har inte själv läst in den till excel.

 

det "enda" jag vill är att hämta ut alla produkterna ifrån Kolumn 2... C12...

alltid kolumn B...

sen vill jag hämta ett värde för varje produkt... med hänsyn till användarens inmatning...

 

1. hämta ut produkter till excelark.

C12

C3O

C4F

..

 

2. sen vill jag hämta värden för produkterna... om användaren matar in 2, så ska den gå till kolumn D och söka efter ?2 typ.. eller ngt.. och sen ta ut det värdet...

 

eller så kanske man skulle kunna gå tillbaka till B kolumnen, och stega igenom produkterna och på så sätt flytta offset och sen hämta värdet?!?!

 

 

 

 

Link to comment
Share on other sites

Här har du ett exempel utifrån den fil du sände mig. Egentligen borde dettagå att göra bättre och stabilera med formler på arbetsbladet, men det fungera ju lika bra i VBA.

 

Koden letar reda på tabell 291.2

Hittar slutet på den genom att hitta först acellen med text letat nedifrån på bladet. Detta kan du givetvis byta ut mot en sökning efter tabell 291.3

Sedan letar den inom det nu funna området efter ?1, ?2 osv.

 

Till sist tar den ut värden för en av dina önskade produkter och presenterar detta i en msgbox.

 

Resten får du göra själv...

Fast givetvis får du även fråga. Men se detta som en inspiration, det är troligtvis inte bästa och snabbaste sättet att lösa detta på, men ETT sätt.

 

[color="#0000ff"]Sub[/color] Dummy_find()
    [color="#0000ff"]Dim[/color] rnTop As Range
    [color="#0000ff"]Dim[/color] rnBottom As Range
    [color="#0000ff"]Dim[/color] rwIndex(6) As Integer
    [color="#0000ff"]Dim[/color] colIndex(6) As Integer
    [color="#0000ff"]Dim[/color] rnTemp As Range
    [color="#006400"]' hitta tabellen[/color]
    [color="#0000ff"]Set[/color] rnTop = Cells.Find(What:=[GRÅ]"291.2"[/GRÅ], After:=Cells(1, 1), LookIn:=xlValues, LookAt:= _
        xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
        [color="#0000ff"]False[/color], SearchFormat:=[color="#0000ff"]False[/color])

    [color="#006400"]' nedre kant av tabellen[/color]
    [color="#0000ff"]Set[/color] rnBottom = Range([GRÅ]"a500"[/GRÅ]).[color="#0000ff"]End[/color](xlUp)

    [color="#006400"]' hitta datakolumner och rader[/color]
    [color="#0000ff"]With[/color] Range(rnTop, rnBottom).Rows.EntireRow
        [color="#0000ff"]For[/color] i = 1 [color="#0000ff"]To[/color] 6
            [color="#0000ff"]Set[/color] rnTemp = .Find(What:=[GRÅ]"?"[/GRÅ] & i, After:=rnTop, LookIn:=xlValues, LookAt:= _
            xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
            [color="#0000ff"]False[/color], SearchFormat:=[color="#0000ff"]False[/color])
            [color="#0000ff"]If[/color] [color="#0000ff"]Not[/color] rnTemp Is [color="#0000ff"]Nothing[/color] [color="#0000ff"]Then[/color]
                rwIndex(i) = rnTemp.Row
                colIndex(i) = rnTemp.Column
            [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
        [color="#0000ff"]Next[/color]
        [color="#006400"]'hitta sökta värden[/color]
        [color="#0000ff"]Set[/color] rnTemp = .Find(What:=[GRÅ]"C12"[/GRÅ], After:=rnTop, LookIn:=xlValues, LookAt:= _
            xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
            [color="#0000ff"]False[/color], SearchFormat:=[color="#0000ff"]False[/color])
            [color="#0000ff"]For[/color] i = 1 [color="#0000ff"]To[/color] 3
                [color="#0000ff"]If[/color] [color="#0000ff"]Not[/color] rnTemp Is [color="#0000ff"]Nothing[/color] [color="#0000ff"]Then[/color]
                    [color="#0000ff"]MsgBox[/color] [GRÅ]"värde "[/GRÅ] & i & [GRÅ]" "[/GRÅ] & Cells(rnTemp.Row, colIndex(i)).Value
                [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
            [color="#0000ff"]Next[/color]

            [color="#0000ff"]Set[/color] rnTemp = .FindNext(rnTemp)
            [color="#0000ff"]For[/color] i = 1 [color="#0000ff"]To[/color] 3
                [color="#0000ff"]If[/color] [color="#0000ff"]Not[/color] rnTemp Is [color="#0000ff"]Nothing[/color] [color="#0000ff"]Then[/color]
                    [color="#0000ff"]MsgBox[/color] [GRÅ]"värde "[/GRÅ] & i + 3 & [GRÅ]" "[/GRÅ] & Cells(rnTemp.Row, colIndex(i)).Value
                [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
            [color="#0000ff"]Next[/color]
    [color="#0000ff"]End[/color] [color="#0000ff"]With[/color]

[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

Ska kanske säga att ingen felkoll görs och den utgår från att det verkligen finns sex värden att leta upp.

 

 

Edit:

Om den passar, utveckla den vidare till att exemplevis ta emot argrument som vilken tabell, vilken rad och vilken produkt och sedan returnera detta värde. Kanske även ett argument om vilket blad funktionen ska titta på.

 

men nu har du ivatfall kod som kan leta reda på det önskade värdet.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

 

[inlägget ändrat 2005-03-11 10:09:06 av Monshi]

Link to comment
Share on other sites

'-----------------såhär har jag gjort----------------------------

 

Cells.Find(What:=[GRÅ]"291.2"[/GRÅ], After:=ActiveCell, LookIn:=xlValues, LookAt :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= [color="#0000ff"]False[/color]).Activate

Cell_Start = ActiveCell.Row   [color="#006400"]' rad 73[/color]

Cells.Find(What:=[GRÅ]"TABLE"[/GRÅ], After:=ActiveCell, LookIn:=xlValues, LookAt :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= [color="#0000ff"]False[/color]).Activate

Cell_Slut = ActiveCell.Row  [color="#006400"]' rad 124[/color]

 

TABLE som jag söker på vet jag inget nummer på, därför söker jag enbart på table, för det är början på strängen...

 

nu hhar jag ju ett område, där jag vill söka i. från rad 73 tioll 124-1 eller så

och kolumnerna skall vara A till E typ.

och jag vill söka på ?1, ?2,?3,?4, ?5 och ?6...... då behöver jag väl inte +R egentligen...

 

'--------

ska kolla på ditt exempel monshi.. tackar..

 

som du ser ovan så får jag ut start och slut positionerna... så jag vill endast ha själva sökningen på ?1... hade jag kunnat lite mer VBA så..

 

tack igen... återkommer i denna tråden vid problem..

 

 

 

 

 

[inlägget ändrat 2005-03-11 10:09:37 av M.Mever]

Link to comment
Share on other sites

Jag prvade att kolla efter "L1*" och VG*

och jag får helt fel värden. det första värdet jag får när jag använder VG* är 0,5531.. och det stämmer inte..

 

måste väl göra lite ändringar, ska ju ha ut alla produkter till ett excelark...

sen hämta ut dess värden, med tanke på mode.

 

 

 

 

Link to comment
Share on other sites

Fungerar för mig.

 

men betänk att raden:

[color="#0000ff"]Set[/color] rnBottom = Range([GRÅ]"a500"[/GRÅ]).[color="#0000ff"]End[/color](xlUp)

måste ändras så att det är slutet på din aktuella tabell som som rnBottom innehåller. Hårdikoda om du önskar eller utför ännu en find.

 

Testa även att lägga till

Cells(rnTemp.Row, colIndex(i)).[color="#0000ff"]Select[/color]

där min msgbox skiver ut värdena. Cellerna som data hämtas ifrån markeras då och det blir enklare att felsöka.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

yes... kom på det efter ett tag... la in en find där som letar efter nästa tabell..

 

ska ta och hämta ut koderna/ produkterna ifrån B kolumnen ... lägga dem i ett excelark och läsa in dem en och en... till den sökfunktionen som du gjorde. sen så får jag se vilket mode användaren matar in... och ha en variabel istället för ?1.. får bryta ner stängen så att sökningen kan fungera som den gör nu..

 

 

tack för hjälpen såhär långt..

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...