2016-06-15 13 views
-4

Ich habe diese Funktion (die auf der Basis der I eine Funktion here):Warum wirft VBA beim Passieren eines Range-Objekts Typabweichungsfehler auf?

Function Foo(ByVal r As range) As String 
    MsgBox "WHAT. The function worked? Wow!" 
    Foo = "test" 
End Function 

habe ich versucht, es wie so nennen:

Let max_row = cells.CurrentRegion.Columns.Count 
Set r = range(cells(2, ID_COL), cells(max_row, ID_COL)) 
Foo r 

Und ich bekomme immer die Fehlermeldung: „Laufzeitfehler 13, Typ Mismatch "einmal der Code den Aufruf an Foo trifft.

Zusätzlich habe ich versucht:

Foo (r) 

, die den Fehler verursacht: „Object Expected“ Ich nehme an, dies bedeutet, dass Klammern einen Zeiger auf seinen Wert Ehrerbietung, und nicht (? Immer) in Funktion/Unterprogrammaufrufe.

Ich habe auch versucht, die Funktion ohne die "ByVal", aber das ist auch gescheitert.

Irgendwelche Ideen?

EDIT versucht, was @ScottCraner vorgeschlagen, aber der Fehler bleibt:

Dim text As String 
Let max_row = cells.CurrentRegion.Columns.Count 
Set r = range(cells(2, ID_COL), cells(max_row, ID_COL)) 
text = Foo(r) 

EDIT Wichtiger Hinweis: Diese von einem Makro ausgeführt wird aktiviert Word-Dokument, die Excel-Bibliothek importiert wird und die Arbeitsmappe aus dem Code geöffnet .

+0

Eine Funktion gibt etwas zurück, so dass Sie etwas gleich haben müssen. Wie: 't = Foo (r)' oder ändere es in eine Sub-Funktion anstelle einer Funktion und nenne es so: 'Foo r' –

+6

Es ist nichts falsch mit deiner Codesyntax. Ist das der eigentliche Anrufcode? Auf eine nicht verwandte Anmerkung, zu sagen, VBA ist schlecht oder inadäquat, nur weil Sie seine Funktionsweise nicht verstehen, ist dumm. – Rory

+0

Entschuldigung, für dieses Bit, wenn Sie es in die Frage eingeben (siehe Bearbeiten). Ich habe es erneut mit dem gleichen Ergebnis getestet. Außerdem stimme ich zu! Es ist töricht zu sagen, eine Sprache ist schlecht, bevor Sie verstehen, wie es funktioniert. Deshalb habe ich "wahrscheinlich" gesagt. Ich würde es eine fundierte Vermutung nennen. – tumbleWeed101

Antwort

1

So stellte sich das Problem heraus, dass, weil dieser Code von Word mit der Excel-Bibliothek als Referenz ausgeführt wurde, der Range-Typ auf ein MS-Word-Range-Objekt anstatt auf ein MS-Excel-Range-Objekt gesetzt wurde Meine Funktion suchte nach der falschen Art von Parameter.Hier wird der korrigierte Code (man beachte die ausdrückliche Bezugnahme auf die lib Excel, wenn Foo und die Bereichsvariable r definieren):

Function Foo(r As Excel.Range) As String 
    MsgBox "WHAT. The function worked? Wow!" 
    Foo = "Test" 
End Function 

Sub main() 
    Set workbook = Excel.Workbooks.Open("example.xlsx") 
    Set datasheet = workbook.ActiveSheet 

    Dim rng As Excel.Range 
    Set rng = datasheet.Range("A2:A100") 
    Dim t As String 
    t = Foo(rng) 
    Debug.Print t 
End Sub 

Wie @ScottCraner und andere wiesen darauf hin, das Problem leicht gewesen sein könnte, dass ich eine Variable hatte/Funktion namens Range definiert woanders. In gewisser Weise ist das nur in der Word-Bibliothek und nicht in meinem Code definiert.

+0

Sie sollten Ihre ursprüngliche Frage bearbeiten, um die Tatsache widerzuspiegeln, dass es einen Störfaktor gab und dass die Lösung das Problem löste. –

4

Bei Verwendung der () Sie es auf eine Variable oder andere Richtung zuweisen müssen:

Function Foo(r As Range) As String 
    MsgBox "WHAT. The function worked? Wow!" 
    Foo = "Test" 
End Function 

Sub fun() 
Dim rng As Range 
Set rng = Range("A2:A100") 
Dim t As String 
t = Foo(rng) 
Debug.Print t 
End Sub 

enter image description here

Sie auch nur Foo rng oder Call Foo(rng)

Dank der immer korrekt verwenden können @ Rory


Aber das eigentliche Problem scheint, dass Sie das Wort range als eine Variable, sub oder Funktion an anderer Stelle verwendet haben und dies die korrekte Verwendung von es als ein Objekt ersetzt.

Wie von @ Mat'sMug wies darauf hin,

+0

Dieser Code verursacht einen nicht übereinstimmenden Typfehler in der Zeile "Set rng = range (" A2: A100 ")" Es ist jedoch wahrscheinlich erwähnenswert die SEHR INTERESSANTE Tatsache, dass mein VBA-Editor automatisch alle Instanzen von "Range" durch "ersetzt Angebot". – tumbleWeed101

+2

@ tumbleWeed101 Mann, VBA ist case-insensitive, und die VBA IDE (die glorreiche VBE) formatiert automatisch eine Reihe von Dingen. Wenn Sie ausflippen wollen, deklarieren Sie eine lokale Variable 'Dim range As String' und sehen Sie, was mit allen' Range's überall passiert. Oooooooooh Magie! –

+0

@ tumbleWeed101 Wie Mat's Becher gerade gesagt hat, hast du den Bereich irgendwo als Variable definiert, entweder als Variable, Unterfunktion oder Funktion. –

-1

Schließen excel und Ihren Computer neu zu starten.

Wenn dies nicht funktioniert, kopieren Sie Ihren Code in den Editor, löschen Sie das Codemodul, in dem sich der Code befindet. Fügen Sie ein neues Modul ein und kopieren Sie Ihren Code zurück nach Excel.

Excel VBA-Dateien können ziemlich leicht beschädigt werden.

Versuchen Sie das und dann versuchen Scott Lösung und sehen, ob es funktioniert.

+0

Neustart wurde in der Tat das seltsame Auto-Ersetzung Problem los, aber es behebt das Problem nicht (siehe oben). – tumbleWeed101