对象'_Global'的方法'单元'失败了VBA

时间:2014-02-10 13:15:21

标签: excel vba excel-vba access-vba

编辑:我有一个访问应用程序,我需要打开一个现有的Excel工作表,找到一个日期(已在工作表中)并用1或0填充一行(带有日期单元格列)

这意味着在设置要填充的单元格之前,我必须将datecell.column转换为等效的字母表。

我使用了一个函数,我之前在excel中使用过(如下所示)END EDIT

Function Col_Letter(lngcol) As String
    Dim vArr
    vArr = Split(Cells(1, lngcol).Address(True, False), "$")
    Col_Letter = vArr(0)
    End Function

以下代码是我如何在我的应用程序中使用代码的示例

Dim  CD, d, f, f1, f2, g, strd
  ...
            For n = 0 To 10
            d = CD + n
            strd = Str(d)
            Select Case Weekday(strd)
            Case vbSunday, vbSaturday

            Case Else
            Set f = book.Worksheets(a).Range("5:5").Find(strd)
            f1 = f.Column
            f2 = Col_Letter(f1)
            g = f2 & Srow
            book.Worksheets(a).Range(g).Value = "0"
            End Select
            Next n
        End If
'CD = Current date, a = worksheetname set eariler in code, srow = excel row number set earlier in code`enter code here`
'this is executed in an excel sheet which was opened from access

当我运行它时,有时它会完美运行,有时我会得到Object'_Global'的方法'单元'失败的错误代码,当我点击调试时它突出显示col_letter函数的第三行

vArr = Split(Cells(1, lngcol).Address(True, False), "$")

你有什么想法(貌似)随机选择显示这个错误吗?

2 个答案:

答案 0 :(得分:1)

您需要完全限定单元格对象。试试这个

Function Col_Letter(lngcol As Integer) As String
    Col_Letter = Split(book.Sheets(1).Cells(, lngcol).Address, "$")(1)
End Function

Function Col_Letter(lngcol As Integer) As String
    Col_Letter = Split(book.ActiveSheet.Cells(, lngcol).Address, "$")(1)
End Function

你可能得到的另一个错误是因为这行

f1 = f.Column

如果发现无法返回任何内容怎么办?您可能想要使用

If Not f is Nothing then
    'Rest of the code
End If

答案 1 :(得分:0)

所以,只是你来这个页面遇到类似的问题就是我如何修复它。

@Siddarth指出我的主要问题是我没有正确地(明确地)引用单元格,这是一个主要问题,因为我从Access调用函数(可以在Excel工作表上工作)。

仍然在我尝试了各种方法来验证单元格后,代码仍然无法正常工作,因此我决定使用另一个函数将列号更改为字母...

Function ColumnLetter(ColumnNumber) As String
    Dim n As Integer
    Dim c As Byte
    Dim s As String

n = ColumnNumber
Do
    c = ((n - 1) Mod 26)
    s = Chr(c + 65) & s
    n = (n - c) \ 26
Loop While n > 0
ColumnLetter = s
End Function

因为它不需要excel中的任何单元格,所以在这里工作正常......

我觉得这会让代码执行得慢一点(可能只是我的系统)所以如果你仍然有建议随时发布答案。