从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中纠正此方法的任何建议?
答案 0 :(得分:4)
Selection
对象,它是Excel的原生对象。
有关如何避免依赖Select
和Activate
这些是导致运行时错误的主要原因的详细信息,请参阅此处:
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”,并且xlWhole
和xlByRows
等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
这是一个粗略的例子,但它将是一个足够好的模板,可以让你得到你需要的东西。