2016-06-17 11 views
0

Ich bin ein Anfänger mit VBA und suche Hilfe mit meiner Frage. Ich versuche, die folgende zu tun:Rückgabe eines Bereichsobjekts mit einer IF-Anweisung in VBA

  1. Schleife durch eine Spalte in meiner Tabelle die Zeile zwei eine Kombination von zwei Werten
  2. Dann durch die Reihe Schleife entsprechend finden zu dieser Kombination entspricht, die gehen horizontal zurück Bereich aller Werte, die eine if-Anweisung (> 40) übergeben (die Menge der Zahlen, die die if-Anweisung übergeben, ist immer sequenziell & nur ein Satz pro Zeile dh (15, 34, 32, 42, 45, 56, 67, 56) , 43, 39, 23, 14)
  3. Ich möchte in der Lage sein, auch die Spaltennummer des ersten und letzten Werts zurückzugeben, die die if-Anweisung übergeben, um einen Datumsbereich in einer anderen Zeile
  4. extrahieren zu können

In Pseudo-Code wäre es so etwas wie diese:

For r = 1 To 10000 'Loop through 10000 rows to find the correct ACV field 
       If WkSht.Range("B" & r).Value = "%ACV" And WkSht.Range("C" & r) = bp_upc Then 
        'For column in row(r) 
         'If column > 40 add cell address to range object to be returned 
        'Next Column 
       'End If 

Dann nutzen Sie die Spalte Komponente der ersten und letzten Zelle Adresse in diesem Bereich die Werte in einer anderen Reihe zu bekommen.

Jede Hilfe oder Tipps würden sehr geschätzt werden.

Antwort

1
public sub test 
    dim res as range 
    dim i as long 

    for i = 1 to 10000 
    if WkSht.cells(i, 2).value = "%ACV" and WkSht.cells(i, 3) = bp_upc then 
     dim numbers_range as range 
     with application.intersect(WkSht.rows(i), WkSht.usedrange) 
     set numbers_range = WkSht.range(WkSht.cells(i, 4), .cells(.cells.count)) 
     end with 

     if res is nothing then 
     set res = Get40Range(numbers_range) 
     else 
     dim current_res as range 
     set current_res = Get40Range(numbers_range) 

     if not current_res is nothing then set res = application.union(res, current_res) 
     end if 
    end if 
    next 

    'use res 
    'e.g. print res.address, do res.select or loop over res.areas 
end sub 

private function Get40Range(byval row as range) as range 
    dim c as range, start40 as range, end40 as range 

    for each c in row 
    if c.value > 40 then 
     if start40 is nothing then set start40 = c 
     set end40 = c 
    elseif c.value <= 40 and not start40 is nothing then 
     exit for 
    end if 
    next 

    if end40 is nothing and not start40 is nothing then 
    set end40 = row.cells(row.cells.count) 
    end if 

    if not start40 is nothing then set Get40Range = start40.resize(, end40.column - start40.column + 1) 
end function 
+0

Wowza - das ist eine Menge Arbeit für den kleinen Pseudocode geliefert. Hoffe es ist geschätzt! – dbmitch

+0

@GSerg Vielen Dank für die schnelle Antwort. Der Code, den du zur Verfügung gestellt hast, macht genau das, was ich brauche, also war es extrem hilfreich. Ich musste einige Funktionen nachschlagen, die du benutzt hast, aber es macht langsam Sinn. Danke noch einmal! –