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

时间:2016-12-06 15:32:00

标签: excel-vba ms-access vba excel

从MSAccess,我正在创建并填充XLS表。一切都按预期工作。作为最后一步,我想清理XLS以取代" 0"使用""。

的值

从XLS宏建模,我尝试了以下方法,但是从MSAccess VBA生成了一个Object Required 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中纠正此方法的任何建议?

3 个答案:

答案 0 :(得分:4)

Access对象模型中不存在

Selection对象,它是Excel的原生对象。

有关如何避免依赖SelectActivate这些是导致运行时错误的主要原因的详细信息,请参阅此处:

How to avoid using Select in Excel VBA macros

您只需要执行此操作,以避免完全依赖Select

wks4.Range("P:P").Replace What:="0", Replacement:="", LookAt:=xlWhole, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

您也可以这样做:

wks4.Range("P:P").Select
appXLS.Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

但由于链接答案中列出的原因,这通常不是首选。

早期/晚期绑定说明:

如果您尚未添加对Excel库的引用,则使用“Late Binding”,并且xlWholexlByRows等Excel常量不可用。在这种情况下,这些将被编译为变体类型的未声明变量,默认值为0 /空。

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

这可能会引发错误,因为xlWhole的实际值为1,xlByRows也是1.如果您使用后期绑定,请将这些添加到模块的顶部或过程:

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

答案 1 :(得分:2)

完全摆脱Select并直接使用该对象。

wks4.Range("P:P").Replace What:="0", Replacement:="", LookAt:=xlWhole, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

如果这不起作用,请告诉我您是否使用早期或晚期绑定。

答案 2 :(得分:2)

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

这是一个粗略的例子,但它将是一个足够好的模板,可以让你得到你需要的东西。