Ms access 动态创建范围后期绑定VBA

Ms access 动态创建范围后期绑定VBA,ms-access,vba,late-binding,Ms Access,Vba,Late Binding,尝试使用以下方法动态创建范围: ws.Range(Cells(1, 1), Cells(q + 1, z + 1)).Value2 = xaRR 这在excel中非常有效,但access vba一直给我带来问题。它不喜欢细胞部分。令人恼火的是,这没有给我任何麻烦 ws.Cells(1,1).Value = blah blah blah 当我尝试这个: Dim oXL As Object: Dim wb As Object: Dim ws As Object: Dim rN

尝试使用以下方法动态创建范围:

 ws.Range(Cells(1, 1), Cells(q + 1, z + 1)).Value2 = xaRR
这在excel中非常有效,但access vba一直给我带来问题。它不喜欢细胞部分。令人恼火的是,这没有给我任何麻烦

 ws.Cells(1,1).Value = blah blah blah
当我尝试这个:

        Dim oXL As Object: Dim wb As Object: Dim ws As Object: Dim rNg As Object: Dim cl As Object
        Set wb = .Workbooks.Add
        Set ws = wb.Sheets
        Set rNg = ws.Range
        Set cl = rNg.Cells
        ws.rNg(cl(1, 1), cl(q + 1, z + 1)).Value2 = xaRR
它说rNg不支持这个属性或方法


有人能帮我看看明显的问题吗?

您的原始行使用了对Activesheet的隐式引用。在Excel中,这是可行的(但如果您不打算使用Activesheet,这将是一个bug),但在Access中,这将是一个错误。对于显式调用,使用工作表引用限定单元格调用:

我假设
ws
工作表
对象,而不是
工作表
对象

ws.Range(ws.Cells(1, 1), ws.Cells(q + 1, z + 1)).Value2 = xaRR
或者在您的第二个示例中:

我删除了Cells变量,还用指令分隔符替换了逗号。指令分隔符是邪恶的

您的
ws
变量都是表,因此我刚刚获取了第一个变量,但是您的实现可能需要改变

Dim oXL As Object, wb As Object, ws As Object
Set wb = .Workbooks.Add
Set ws = wb.Sheets(1)
ws.Range(ws.Cells(1, 1), ws.Cells(q + 1, z + 1)).Value2 = xaRR

原始行使用对Activesheet的隐式引用。在Excel中,这是可行的(但如果您不打算使用Activesheet,这将是一个bug),但在Access中,这将是一个错误。对于显式调用,使用工作表引用限定单元格调用:

我假设
ws
工作表
对象,而不是
工作表
对象

ws.Range(ws.Cells(1, 1), ws.Cells(q + 1, z + 1)).Value2 = xaRR
或者在您的第二个示例中:

我删除了Cells变量,还用指令分隔符替换了逗号。指令分隔符是邪恶的

您的
ws
变量都是表,因此我刚刚获取了第一个变量,但是您的实现可能需要改变

Dim oXL As Object, wb As Object, ws As Object
Set wb = .Workbooks.Add
Set ws = wb.Sheets(1)
ws.Range(ws.Cells(1, 1), ws.Cells(q + 1, z + 1)).Value2 = xaRR


您需要使用后期绑定吗?@Comintern是的。由于环境原因,我无法使用特定的excel库引用。不幸的是,延迟绑定是一项要求。在Access中,使用
ws来限定对
单元格的调用。
范围需要参数,所以像在原始第一行中一样使用它。您可能可以使用早期绑定来简化调试,并在之后删除引用。较短的选项是
cl.Resize(q+1,z+1)。Value2=xaRR
,因为单元格已经是从A1开始的范围。是否需要使用后期绑定?@Comintern是。由于环境原因,我无法使用特定的excel库引用。不幸的是,延迟绑定是一项要求。在Access中,使用
ws来限定对
单元格的调用。
范围需要参数,所以像在原始第一行中一样使用它。您可能可以使用早期绑定来简化调试,并删除after.shorter选项是
cl.Resize(q+1,z+1)。Value2=xaRR
,因为单元格已经是一个从设置rNg=ws开始的范围。范围也不是受支持的方法或属性。我会一直尝试,直到找到答案。请看我的编辑,您需要将
ws
设置为一张工作表,使用
set ws=wb.Sheets(1)
而不是
set ws=wb.Sheets
Ah。我必须这样做,取出rNg参考,它就像一个chamr。谢谢为什么指令分隔符是邪恶的?我真的很好奇this@DougCoats最佳实践是根本不使用它们。如果你看到一行以
Dim
开头,你知道你可以跳过读它,但是如果你使用指令分隔符,你必须读整行,只是为了确保你没有遗漏一些重要的东西,比如
Dim c As String:c=Now():If Instr(1,c,“1”)>0然后结束Else:Do While True:Loop“您的代码刚刚终止或挂起VBE显然设置rNg=ws。Range也不是受支持的方法或属性。我会一直尝试,直到找到答案。请看我的编辑,您需要将
ws
设置为一张工作表,使用
set ws=wb.Sheets(1)
而不是
set ws=wb.Sheets
Ah。我必须这样做,取出rNg参考,它就像一个chamr。谢谢为什么指令分隔符是邪恶的?我真的很好奇this@DougCoats最佳实践是根本不使用它们。如果你看到一行以
Dim
开头,你知道你可以跳过读它,但是如果你使用指令分隔符,你必须读整行,只是为了确保你没有遗漏一些重要的东西,比如
Dim c As String:c=Now():If Instr(1,c,“1”)>0然后结束Else:Do While True:Loop'您的代码刚刚终止或挂起VBE