2017-06-27 6 views
1

Ich entschuldige mich, wenn das klingt wie eine wirklich dumme Frage, aber ich bin neu in der Verwendung von Excel und VBA und habe mehr Zeit mit anderen Sprachen verbracht. Ich habe festgestellt, dass ich Code schreibe, um robuster zu sein, und ich schreibe den gleichen Code-Block, um immer wieder dasselbe zu tun. Gibt es eine Möglichkeit, dass ich diesen Codeblock einfach aufrufen und den gesuchten Wert abrufen und als die gewünschte Variable speichern und dann in einem anderen Sub verwenden kann.VBA Sub, das einen Wert zurückgibt

Hoffentlich macht dieses Beispiel es klarer. Ich möchte alle Werte in Zeile 1 beginnend bei A1 suchen und gehen bis der Wert leer ist. Ich möchte die Zelle mit dem Wert "Frequency" finden und dann die Spaltenindexnummer zurückgeben.

Sub findFrequency() 
     'find "Frequency" colum and save the column index number 
     Dim fFreq As String 
     Dim FreqCol As Variant 
     Range("A1").Select 
     fFreq = "Frequency" 
     Do Until IsEmpty(ActiveCell) 
      If ActiveCell.Value = fFreq Then 
       FreqCol = ActiveCell.Column 
       Exit Do 
      End If 
     ActiveCell.Offset(0, 1).Select 
     Loop 
     End Sub 

Jetzt ideal kann ich einen anderen und verwenden Sie den Wert aus dem obigen Code schreiben

Sub Execute() 
Call findFrequency 
Cells(5, FreqCol).Select 
With Selection.Interior  
    .Pattern = xlSolid 
    .PatternColorIndex = xlAutomatic 
    .ThemeColor = xlThemeColorAccent5 
    .TintAndShade = 0.599993896298105 
    .PatternTintAndShade = 0 
End With 
End Sub 

ich einen Fehler, wenn ich dies, weil der Wert von FreqCol laufen nicht vom Laufen die auf alles eingestellt ist Rufen Sie findFrequency auf. Gibt es einen besseren Weg dies zu tun oder sollte ich etwas anders strukturieren?

+0

'Sub' kann keinen Wert zurück (aber es kann den Wert einer globalen Variablen zuweisen). Was Sie suchen, ist 'Funktion'. –

Antwort

1

Versuchen Sie folgendes:

Function findFrequency() 
    'find "Frequency" colum and save the column index number 
    Dim fFreq As String 
    Dim FreqCol As Variant 
    Range("A1").Select 
    fFreq = "Frequency" 
    Do Until IsEmpty(ActiveCell) 
     If ActiveCell.Value = fFreq Then 
      findFrequency = ActiveCell.Column 
      Exit Do 
     End If 
    ActiveCell.Offset(0, 1).Select 
    Loop 
End Function 

Sub Execute() 
Dim FreqCol As Long 
FreqCol = findFrequency() 
Cells(5, FreqCol).Select 
With Selection.Interior  
    .Pattern = xlSolid 
    .PatternColorIndex = xlAutomatic 
    .ThemeColor = xlThemeColorAccent5 
    .TintAndShade = 0.599993896298105 
    .PatternTintAndShade = 0 
End With 
End Sub 
1

Warum Schleife oder eine Zelle wählen Sie einen Wert zu finden? Verwenden Sie einfach .Find

Function findFrequency() As Long 
    Dim ws As Worksheet 
    Dim aCell As Range 

    Set ws = ActiveSheet 

    With ws 
     Set aCell = .Columns(1).Find(What:="Frequency", LookIn:=xlValues, _ 
     LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
     MatchCase:=False, SearchFormat:=False) 

     If Not aCell Is Nothing Then findFrequency = aCell.Column 
    End With 
End Function 

auch, was passieren soll, wenn die „Frequenz“ nicht gefunden wird. Sie müssen auch darauf achten.

Sub Execute() 
    Dim FreqCol As Long 

    FreqCol = findFrequency 

    If FreqCol = 0 Then 
     MsgBox "Frequency not found" 
     Exit Sub 
    End If 

    With Cells(5, FreqCol).Interior 
     .Pattern = xlSolid 
     .PatternColorIndex = xlAutomatic 
     .ThemeColor = xlThemeColorAccent5 
     .TintAndShade = 0.599993896298105 
     .PatternTintAndShade = 0 
    End With 
End Sub 
+1

Beat mich auf die Antwort von 2 Stunden @ Siddharth. Ich denke daran, die 'Find'-Antwort als Vorlage zu schreiben, damit ich sie in weniger als einer Sekunde kopieren und einfügen kann. :) –

+0

Nun, ich habe eine Art bereit [Hier] (http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/): D –

+0

Ja, hatte ein Blick auf Ihre Website. Ich habe immer noch den Sinn, selbst einen zu gründen, aber ich habe noch nichts Neues zu dieser Mischung hinzuzufügen. –

0

Der Code würde so sein.

Haupthauptunter ist findFrequency, Sub-Prozedur ist Sub Ausführen (rng As Range)

Sub findFrequency() 
     'find "Frequency" colum and save the column index number 
     Dim fFreq As String 
     Dim FreqCol As Variant 
     Range("A1").Select 
     fFreq = "Frequency" 
     Do Until IsEmpty(ActiveCell) 
      If ActiveCell.Value = fFreq Then 
       FreqCol = ActiveCell.Column 
       Execute Cells(5, FreqCol) 
       Exit Do 
      End If 
     ActiveCell.Offset(0, 1).Select 
     Loop 
End Sub 
Sub Execute(rng As Range) 

With rng.Interior 
    .Pattern = xlSolid 
    .PatternColorIndex = xlAutomatic 
    .ThemeColor = xlThemeColorAccent5 
    .TintAndShade = 0.599993896298105 
    .PatternTintAndShade = 0 
End With 
End Sub