2015-01-07 7 views
5

Ich verwende diese Funktion, um einen Wert aus einer geschlossenen Arbeitsmappe abzurufen. In dieser 8. Zeile dieses Codes verstehe ich nicht, warum "A1" verwendet wird. Was genau passiert in dieser ganzen 8. Zeile? Ich bin verwirrt durch das Argument xlR1C1.Warum wird die Zelle "A1" in dieser GetValue-Funktion in VBA verwendet?

Private Function GetValue(path, file, sheet, ref) 

    Dim arg As String 
    If Right(path, 1) <> "\" Then path = path & "\" 
    If Dir(path & file) = "" Then 
     GetValue = "File Not Found" 
     Exit Function 
    End If 
    arg = "'" & path & "[" & file & "]" & sheet & "'!" & _ 
     Range(ref).Range("A1").Address(, , xlR1C1) 
    GetValue = ExecuteExcel4Macro(arg) 

End Function 
+0

Nicht ganz sicher, aber es könnte sein, dass 'ref' eine Sammlung von Zellen ist, also wird immer ein Wert zurückgegeben. – NickSlash

+0

Wir müssten den 'ExecuteExcel4Macro()' Code sehen, um zu sehen, welche Eingabe er benötigt. Aber die Syntax nach '.Address()' ist dies: http://msdn.microsoft.com/en-us/library/office/ff821207%28v=office.15%29.aspx – Chrismas007

+0

ExecuteExcel4Macro ist -> http://msdn.microsoft.com/en-us/library/office/ff193589%28v=office.15%29.aspx Obwohl, wenn Sie immer noch Excel 4 Makros jetzt verwenden ...könnte Zeit für ein Upgrade sein. – Tmdean

Antwort

1

xlR1C1 ist ein reference style, die verwendet wird, um festzulegen, wie Formeln arbeiten. Wenn Sie diesen Stil verwenden, funktionieren Ihre Formeln und sehen sehr anders aus als Sie erwarten. Die R1C1-Spezifikation bedeutet im Grunde genommen, dass die Zellen anders bezeichnet werden, indem die Spalten-Ordnungszahlen & anstelle der Buchstaben-Namen verwendet werden. Wenn Sie beispielsweise xlR1C1 verwenden, würden Sie mithilfe von =R2C2 (Zeile 2, Spalte 2) auf Zelle B2 zugreifen. Ein weiteres Beispiel, Zelle C10 könnte als =R10C3

Als was passiert in Zeile 8 ... Sie erstellen eine Zellreferenz, die wie folgt aussieht: (Beachten Sie, dass Ihre Zellreferenz wird anders, weil es eine Datei hat Pfad in ihm)

='[Myfilename.xlsx]Sheet1'!R1C1 

Sie den Debugger die Zeichenfolge in der arg variablen enthalten anzeigen können.

1

Das Hinzufügen von Range("A1") zum Code scheint überhaupt nichts zu tun. Die Eingabe in das unmittelbare Fenster führt zu einigen ... unerwarteten Ergebnissen.

?Range("B3").Range("A1").Address 
$B$3 

Nun, würde ich erwarten, dass $A$1 zurückzukehren, aber es scheint, dass dieser Teil der Funktion wird die Adresse der Range(ref) zurückzukehren.

Jetzt, Range.Address mit dem ReferenceStyle Argument aufrufen würde diese Ergebnisse erzeugen.

?Range("B3").Range("A1").Address(,,xlR1C1) 
R3C2 
+0

Es tut nichts zu einem einzelnen Zellbereich, aber für einen Multi-Zellbereich (d. H. Bereich ("C3: H99")) gibt es die oberste linke Zelle zurück. – Tmdean

+1

Ich habe gerade gelernt, dass @Tmdean. http://StackOverflow.com/a/27828218/3198973 – RubberDuck

4

Range().Range()Documentation here:

Wenn auf ein Objekt Range angewendet, ist die Eigenschaft, auf das Objekt relativ Range. Wenn die Auswahl z. B. die Zelle C3 ist, gibt Selection.Range("B1") die Zelle D3 zurück, da sie relativ zum Objekt Range ist, das von der Selection-Eigenschaft zurückgegeben wird. Auf der anderen Seite gibt der Code ActiveSheet.Range("B1") immer die Zelle B1 zurück.

Der Code wird mit der zweiten Range("A1") zu gewährleisten, dass, wenn Sie eine ref Bereich größer als eine Zelle haben, ist es nur die linke obere Zelle dieses Bereichs zurückgibt. Es würde auch scheinen, Ihre andere ExecuteExcel4Macro() erfordert eine R1C1 Typ Zellreferenz, so dass die Adresse in diesen Typ für die Übergabe der Zeichenfolge in die Sub umgewandelt wird.

+0

@Shampouya Hat dies Ihr Problem gelöst? – Chrismas007

Verwandte Themen