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

Kopiera vissa celler utifrån ett vilkor


Micke793

Rekommendera Poster

Hej,

Jag är nybörjare på VB-script, men kom på att ett script skulle kunna lösa mitt problem.

Jag hämtar ut data varje vecka och kollar status på ordrar.
Från den datan gör jag uträkningar för att få fram en procentsats per status.

Nu är det så att jag skulle vilja visa ordernummer på vissa statusar för att kunna göra uppföljning enkelt och pressentera dessa bredvid min rapport.

Datan får jag ut på Blad2 och med lite olika formler pressenterar jag den på Blad1.

i kolumn A på blad2 får jag statusen (11, 12, 13, 21, 22 och 23) och i kolumn B får jag ordernumret.

Nu skulle jag vilja ha ett script som loopar igenom och kopiera alla ordernummer på "blad2" med status 12 och 13 till kolumn H på "blad1" med början från rad 2 (rad 1 innehåller en överskrift) och de ordrenummer med status 22 och 23 till kolumn I med start från rad 2 även där.

Eftersom jag gör detta varje vecka med olika ordernummer för varje gång så vill jag att scriptet först ska radera all data i kolumn H och I från rad 2 och ner till sista raden som inehåller data, för att sedan fylla på med nya ordernummer från veckans import.

Exempel på data på blad2 som ska kopieras till H och I på blad1:
I detta exempel ska B2 kopieras till I2, B3 till H2, B4 till H3 osv.
      A         B
1  | 11 | 001234
2  | 22 | 001245
3  | 13 | 001254
4  | 12 | 001199
5  | 23 | 001201
6  | 21 | 001232
7  | 21 | 001197
8  | 12 | 001222
9  | 23 | 001249
10| 13 | 001214

Tack på förhand! smile1.gif

Länk till kommentar
Dela på andra webbplatser

Enklaste lösningen brukar vara den där man använder så lite VBA-kod som möjligt brukar jag tycka.

 

 

Och det finns många olika vägar för att nå det du önskar. 

börjar med den den helt utan VBA, Pivotrapport. Skapa en rapport med det du önskar som filter. Kanske är precis det du behöver. Bara uppdatera din Pivot varje vecka när du fyllt på med nytt material i din tabell.

 

Andra alternativet är att via formler, om du kan säga hur många rader det kan vara, som filtrerar ut dina rader till ett område som kopieras via VBA

 

Tredje alternativet,  ett autofilter appliceras och VBA-kopierar

Fjärde alternativet,  ett avancerat filter appliceras och kopierar. Via VBA eller manuellt. 

Testa alternativ ett och fyra och återkom

Nummer fyra, infoga några rader ovan din tabell,

Skriv in rubriken du filtrera, värdena under.

Aktivera avancerat filter, ange filterområde och målområde (dock bara på samma blad).

 

 

:-)

Länk till kommentar
Dela på andra webbplatser

Jag har provat med pivot varianten redan och avancerat filter,  men det "ballar ur" efter ett tag eftersom det ibland inte är några 12 utan kanske bara 13.... ibland både 12 och 13.

Plus att det är en olika mäng ordrar varje gång, ibland är det 3 ordrar som har status 12 eller 13 och ibland 52 :-)

Ja jag tror du förstår vad jag menar :-)

 

Kruxet är att allt måste vara samlat/pressenterat på ett blad, eftersom det är olika personer som ska titta på detta.... alltså för att göra det enkelt.

 

Idag måste jag lägga ner massa tid för att få det så.

 

Så jag skulle ju vilja ha en VBA kod som loopar igenom och kopierar över ordernumren för dom som har status 12,13,23 och 33 som sagt :-)

 

Just själva tabellen får jag utifrån en pivot, där jag summerar till höger och plockar ut statusen.

Detta eftersom en order kan innehålla flera rader, dom raderna kan olika statusar.... men jag vill bara ha ut den högsta statusen och pressentera det order vis... därför summer jag "MAX" och får på så sätt ut rätt status på ordern.

Länk till kommentar
Dela på andra webbplatser

Okej, lite VBA-kod då

Sub MyCopy()

    'rensa blad2
    With Blad2
        If .Range("H1").CurrentRegion.Rows.Count > 1 Then
            .Range("h1").CurrentRegion.Clear
        End If
    End With
    Dim c As Range
    Dim af As AutoFilter
    'applicerar ett filter och kopierar resultatet
    'antar att alla kolumner ska kopierar, filter läggs på kolumn 1
    With Blad1
        .Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:="=10", _
            Operator:=xlOr, Criteria2:="=12"
        .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Blad2.Range("H1")
        .Range("A1").AutoFilter 'filter tas bort
    End With
    


End Sub

Du får nog anpassa lite efter dina bladnamn och de områden som ska behandlas/kopieras.

Om inte alla kolumner ska kopieras exempelvis.

 

Notera att tabellen i H1 måste vara fristående för att sättet jag tömmer den på ska fungera. Om den inte är fri får vi ta annan metod, exempelvis

Blad2.Range("H:I").Clear

Länk till kommentar
Dela på andra webbplatser

Nja, den där koden fungerade inte riktigt som jag tänkt mig tyvärr....

 

På blad1 har jag en tabell som ser ut så här:

       A         B
1  | 11 | 001234
2  | 22 | 001245
3  | 13 | 001254
4  | 12 | 001199
5  | 23 | 001201
6  | 21 | 001232
7  | 21 | 001197
8  | 12 | 001222
9  | 23 | 001249
10| 13 | 001214

 

Från den ska endast ordernumren i kolumn B med status 12 och 13 kopieras till kolumn H på blad2, med start från H2 eftersom H1 innehåller en överskrift. statusen som ligger i kolumn A vill jag inte kopiera över.

Ordernummer med status 22 och 23 ska kopieras till kolumn I på blad2 med start från I2.

 

Clear kunde jag fixa själv genom att byta ut till koden: 

Blad2.Range("H2:I600").Clear      ;)

 

Ska förtydliga att ordernummer med status 11 och 21 ska det inte göras något med, dom ska bara ligga kvar :)

Länk till kommentar
Dela på andra webbplatser

Bara kopiera kolumn B och ej rubrikrad?

Okej

status 12 och 13 kolumn H, status 22 och 23 kolumn I.

Sub MyCopy()
    Application.ScreenUpdating = False
    'rensa blad2
    With Blad2
        .Range("i2:H600").Clear
    End With
   
    'applicerar ett filter och kopierar resultatet
    'antar att alla kolumner ska kopierar, filter läggs på kolumn 1
    With Blad1
        '12 och 13, anpassa eller hämta värden från cell om du vill vara helt flexibel
        .Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:="=12", _
            Operator:=xlOr, Criteria2:="=13"
        .Range("A1").CurrentRegion.Offset(1, 1).Resize(, 1).SpecialCells(xlCellTypeVisible).Copy Blad2.Range("H2")
        
        '22, 23
        .Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:="=22", _
            Operator:=xlOr, Criteria2:="=23"
        .Range("A1").CurrentRegion.Offset(1, 1).Resize(, 1).SpecialCells(xlCellTypeVisible).Copy Blad2.Range("i2")
        
        .Range("A1").AutoFilter 'filter tas bort
    End With
    Application.ScreenUpdating = True


End Sub
Länk till kommentar
Dela på andra webbplatser

Ja men det är ju strålande!! :D

 

Fungerar ju klockrent!

 

Tack så hemskt mycket för hjälpen!

 

Nu ska jag studera koden så jag förstår vad som händer också ^_^

 

Vad gör: Operator:=xlOr

Länk till kommentar
Dela på andra webbplatser

Sorry, jag trodde det stod xl10 (siffran tio)....

Men det står ju OR ;)

 

Klarnade lite för mig nu....

 

Har hittat några bra grundkurser för VBA, men dom är lite för enkla.... jag skulle vilja hitta någon fortsättning också :)

Får väl leta efter någon bra bok, du kanske har något tips?

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...