MSAccess中的Excel自动化-使用VBA替换字符?

MSAccess中的Excel自动化-使用VBA替换字符?,excel,ms-access,vba,Excel,Ms Access,Vba,从MSAccess,我正在创建和填充XLS工作表。一切如期进行。作为最后一步,我想清理XLS以替换0值 从XLS宏建模时,我尝试了以下操作,但从MSAccess VBA生成了所需的对象err msg: Dim appXLS As Object Dim wbk As Object Dim wks1 As Object Dim wks2 As Object Dim wks3 As Object Dim wks4 As Object Set appXLS = CreateObject("Excel.

从MSAccess,我正在创建和填充XLS工作表。一切如期进行。作为最后一步,我想清理XLS以替换0值

从XLS宏建模时,我尝试了以下操作,但从MSAccess VBA生成了所需的对象err msg:

Dim appXLS As Object
Dim wbk As Object
Dim wks1 As Object
Dim wks2 As Object
Dim wks3 As Object
Dim wks4 As Object

Set appXLS = CreateObject("Excel.Application")
Set wbk = appXLS.Workbooks.Add(1)

appXLS.Visible = True
wbk.Activate

Set wks4 = wbk.Sheets.Add(After:=wbk.Sheets(wbk.Sheets.COUNT))
wbk.Sheets(4).NAME = "Item Detail"
Set wks4 = wbk.ActiveSheet

'>>populate and format the XLS from MSAccess VBA
'... it's working as required

'Clean-Up:

wks4.Range("P:P").Select
Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
在MSAccess VBA中,有没有纠正这种方法的建议?

完全放弃Select,直接使用对象

wks4.Range("P:P").Replace What:="0", Replacement:="", LookAt:=xlWhole, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
如果这不起作用,请告诉我您使用的是早绑定还是晚绑定

Dim xlApp As Object
Dim xlBook As Object 
Dim xlSheet As Object
Dim xlRange As Object
Dim cell As Object

Set xlApp = CreateObject("Excel.Application")
Set xlBook= xlApp.Workbooks.Open(sFile)
Set xlSheet = xlBook.Sheets(1)

With xlSheet
    Set xlRange  =.Range("P1:P10000")
    For Each cell In xlRange
        If cell.Value= 0 Then
            cell.Value = vbNullString
        End If
    Next cell 
End With
这是一个粗略的例子,但它将是一个足够好的模板,让你得到你需要的

Access对象模型中不存在选择对象,它是Excel固有的

有关如何避免依赖Select和ACTIVE的详细信息,请参见此处。Select和ACTIVE是导致运行时错误的主要原因:

您只需执行此操作,即可避免依赖Select:

你也可以这样做:

wks4.Range("P:P").Select
appXLS.Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
但由于链接答案中列出的原因,这通常不是首选

提前/延迟装订说明:

如果尚未添加对Excel库的引用,则使用的是后期绑定,Excel常量(如xlWhole和xlByRows)不可用。在此上下文中,这些变量将被编译为variant类型的未声明变量,默认值为0/empty

提醒:使用Option Explicit将阻止编译此代码,并在运行前提醒您此类错误,从而可能使诊断和修复更容易

这可能会产生错误,因为xlWhole的实际值为1,xlByRows也为1。如果您使用的是后期绑定,请在模块或过程的顶部添加以下内容:

Const xlByRows As Long = 1
Const xlWhole As Long = 1

我不会添加答案,因为每个人都在说我将要说的话,但是-我认为Sheets4是您创建为wks4的工作表?您可以只使用wks4.Name=Item Detail并删除Set wks4=wbk.ActiveSheet,因为它是在创建工作表时设置的。您可能还需要添加一些代码来检查项目详细信息是否已经存在。我不清楚晚期与早期的区别,但我确实在上面的模块中加入了额外的XLS声明行。-Thanks@MarkPelletier您是否添加了对Excel库的引用?如果没有,则需要显式地调整Excel常量的大小或常量:xlother和xlByRows@MarkPelletier-标注Excel常量尺寸的另一种方法是使用该常量的直接长类型值。您需要在VBE for Excel的对象浏览器中查找此项。这是一个重要的区别,每种方法都有ad/dis优势。您正在使用Excel的后期绑定,这会导致参数出现问题。如果您可以使用早期绑定,请这样做,因为它总体上工作得更好。@Scott Holtzman-谢谢。我在过去曾跌跌撞撞地经历过这一切;我会的revisit@David泽蒙斯-谢谢你,正是我的问题。修正了。我会记住这一点作为最后的手段我的XLS可以有30K+记录,有多个列要检查/清除0值…可以通过浏览应用程序VBE中的对象资源管理器来查找特定常量的常量长值。这是给未来用户的一个好提示。
Const xlByRows As Long = 1
Const xlWhole As Long = 1