2

当我使用 VLookup 运行倒数第三行时,我不断收到“对象 '_Global' 的方法 'Range' 失败”。这似乎是对失败的 Range("InfoOmArt") 的引用。我现在永远被困住了。

'Writes array "Artskoder" in a new worksheet
Dim InfoOmArt As Range
Sheets.Add
ActiveSheet.Name = "InformationOmArter"
Range("A1").Value = "Artsforkortelse"
Range("B1").Value = "Artskode"
Set InfoOmArt = ActiveSheet.Range("A1:B54")
InfoOmArt.Value = Artskoder
Worksheets("InformationOmArter").Move after:=Worksheets("Standarder")
Worksheets("Standarder").Activate


'Looping through sorter
Dim p As Range, abbr As Variant, MyStr As String

For Each p In Range(Cells(1, 1), Cells(44, 2))
    abbr = Cells(p.Row, 1).Value
    Debug.Print abbr
    MyStr = Application.WorksheetFunction.VLookup(abbr, Range("InfoOmArt"), 2, False) 'Arg.1 as a string seems to only works if it searhes in the spreadsheat, not in an array
    Cells(p.Row, 4).Value = MyStr
Next p
4

1 回答 1

1

这里有一些问题我建议需要改变:


“我不断收到“对象'_Global'的方法'范围'失败””

上面的问题是您设置了一个Range名为InfoOmArt. 然后,您可以将其用作语句NamedRange中的一个。Range(..)这是不正确的,因为您的变量本身已经是一个Range对象。所以改变:

Range("InfoOmArt")成刚刚InfoOmArt


“但是当我用 Worksheets("InformationOmArter").Range("A1:B54") 指定它时它不应该工作吗。我试图将其更改为 InfoOmArt。现在它说明了无法在 Worksheetsfunction 中使用属性 VLookup ?”

不,它不必工作本身。只要您的变量Abbr包含一个在对象中找不到的Range,它就会在您身上出错(这次是错误 1004)。


然后你正在通过一个Range像这样的对象:

For Each p In Range(Cells(1, 1), Cells(44, 2))
    abbr = Cells(p.Row, 1).Value

这基本上做了两次同样的事情。Range(Cells(1, 1), Cells(44, 1)), 只循环一次。并且只是为了将来参考,最好将这些值拉入一个数组以循环访问内存,并且不要对工作表单元格进行任何调用(在大范围内速度较慢)。


你还做了很多隐含的工作表引用。这些引用不包含任何显式 Worksheet父级,因此会调用隐式 ActiveSheet.

这是你应该学会避免的事情。ActiveSheetActivate几乎不需要。看看这个关于 SO 的旧线程,了解如何避免这种情况。


我的最后一个建议是开始使用Range.Find

于 2020-01-24T09:01:23.507 回答