2017-11-27 8 views
2

Ist es möglich, auf der Grundlage von Spaltenüberschriften nach rechts von einer Zelle zu versetzen? Ich habe Code, der einen Bereich durchläuft, und wenn er einen bestimmten Wert findet, werden 12 Spalten nach rechts verschoben. Anstatt Offset (, 12) zu sagen, gibt es eine Möglichkeit, Offset nach rechts in derselben Zeile zu der Spalte mit der gewünschten Überschrift zu sagen?VBA: Offset basierend auf Spaltenüberschriften

Zum Beispiel, wenn die Spalte B den Namen "Host" und mein Bereich ist

rng = ws.range("B1:B20") 

und Spalte N ist "Land" genannt, will ich nicht schreiben:

offset(,12).value = ... 

Statt wenn es so etwas wie:

offset(to column: country).value =... 

der Grund, warum ich dafür bitten, ist nicht spezifisch eine Offset-Zahl der Code mehr resi zu machen Änderungen, die mit meinem Excel-Arbeitsblatt auftreten können.

Ich hoffe, die Erklärung ist klar. Vielen Dank!

+0

Haben Sie versucht, Bereichsnamen zu verwenden? –

Antwort

1

Probieren Sie die unten stehende Funktion aus und geben Sie die Anzahl der Spalten, die Sie benötigen, an Offset von Ihrem Rng an den "Header", den Sie suchen.

Option Explicit 

Function OffesttoHeader(CurrentCol As Long, FindRng As Range, HeaderStr As String) As Long 

    Dim HeaderRng As Range 

    Set HeaderRng = FindRng.Find(what:=HeaderStr) 
    If Not HeaderRng Is Nothing Then 
     OffesttoHeader = HeaderRng.Column - CurrentCol + 1 
    Else 
     OffesttoHeader = -10000 ' raise to a large value >> as an error 
    End If 

End Function 

-Test Sub-Code (die Funktion oben zu testen):

Sub Test() 

Dim ws As Worksheet 
Dim Rng As Range 
Dim NumberofCols As Long 

Set ws = ThisWorkbook.Sheets("Sheet1") ' modify to your sheet's name 
Set Rng = ws.Range("B1:B20") 

' pass the following parameters: 
' 1. Rng.column - in your case column B = 2 
' 2. ws.Rows(1) - the Range to search for the Header, first row in ws worksheet 
' 3. "Header" - the Header string you are searching for 
NumberofCols = OffesttoHeader(Rng.Column, ws.Rows(1), "Header") 

' raise an error message box 
If NumberofCols = -10000 Then 
    MsgBox "Unable to find Header" 
End If 

End Sub  
+0

Hat super funktioniert. Ich musste nur die "+1" von OffsetToHeader entfernen, da es eine Spalte rechts war. Gab es einen Grund, warum Sie das hinzugefügt haben? Vielen Dank! – wra

+0

@wra ich könnte die Berechnungen falsch haben, berechnete den Unterschied, nicht die "Offset" –

+0

Oh okay, gut, sonst hat es perfekt funktioniert. Vielen Dank für Ihre Hilfe! – wra

0

Um die Lösung, die Sie oben versuchen zu erhalten, die Range.Find Methode zu verwenden.

'Column Number 
Dim clmCountry as Integer 

Von hier aus wollen wir den Header finden, indem die Range.Find Verfahren mit

'to find the header 
With ThisWorkbook.Sheets("SheetName") 

    'update the range if necessary 
    clmCountry = .Range("A1:Z1").Find("HeaderName").Column 

End With 

Wenn Sie die gewünschte Spalte gefunden haben, können Sie die folgende Art und Weise versetzt:

... Offset(RowNum, clmCountry).Value = ...