获取 438 错误对象不支持此属性或方法
Posted
技术标签:
【中文标题】获取 438 错误对象不支持此属性或方法【英文标题】:Getting 438 error Object doesn't support this property or method 【发布时间】:2019-02-18 22:06:18 【问题描述】:我有一个包含工作簿的文件夹,我试图将它们合并到一个工作簿中,当它在工作簿中循环时,我从工作表中收集了一些信息到“主”工作表。除“Main”外的每个工作表都包含这种表:https://imgur.com/2kvZjNX。我需要在 Root_cause 和 Solutions 列中加入所有值(在图像中写为文本),并将它们放在主表中的适当列中,它需要看起来像这样:https://imgur.com/rWJaC4W 因为有这样的情况:https://imgur.com/m0MQnXJ where Root_cause 列可以包含合并的单元格我想出了解决方案:
让我们从 1 到 100 取 i (因为 root_cause/solutions 表没有得到那么大的工作表)
寻找符号“№”,一旦找到 - 退出循环
创建空变量 s(用于文本连接 Root_cause 值并将其放入“主”工作表中的“D”列)和 s1(用于文本连接“主”工作表中“E”列的解决方案值) 4.) 由于存在合并单元格的情况(并且我假设 VBA 在循环时将其余单元格视为空)对于 Root_cause 列,我设置了条件,除非两列中的值都为空 - 继续存储值 我收到 438 错误 Object does not support this property or method on this line: https://imgur.com/DIaWwCz 也许我的方法在概念上是错误的,我不知道......
这是我的代码:
Sub Merge()
Path = "C:\Users\mdoskarin001\Desktop\SVOD2\"
Filename = Dir(Path & "*xlsx")
Do While Filename <> ""
Workbooks.Open Filename:=Path & Filename, ReadOnly:=True
sDate = Workbooks(Filename).Sheets(1).Cells(7, 3).Value
sTitle = Workbooks(Filename).Sheets(1).Cells(2, 3).Value
For Each Workbook In Workbooks
If Workbook.Name <> ThisWorkbook.Name Then
Workbook.Worksheets(1).Copy After:=ThisWorkbook.Sheets(1)
ThisWorkbook.Sheets("Main").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Filename
ThisWorkbook.Sheets("Main").Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Value = sTitle
ThisWorkbook.Sheets("Main").Range("C" & Rows.Count).End(xlUp).Offset(1, 0).Value = sDate
For i = 1 To 100
If Workbooks(Filename).Sheets(1).Cells(i, 1).Value = "№" Then
Exit For
End If
Next i
i = i + 1
s = ""
s1 = ""
j = i
Do
If Workbooks(Filename).Sheets(1).Cells(j, 2).Value <> "" Then
s = s + Workbooks(Filename).Sheets(1).Cells(j, 2).Value + vbCrLf
End If
Loop While Workbooks(Filename).Cells(j, 2).Value <> "" Or Workbooks(Filename).Cells(j, 3).Value <> ""
For j = 1 To 100
s = s + Workbooks(Filename).Sheets(1).Cells(j, 2).Value + vbCrLf
s1 = s1 + Workbooks(Filename).Sheets(1).Cells(j, 3).Value + vbCrLf
Next j
ThisWorkbook.Sheets("Main").Range("D" & Rows.Count).End(xlUp).Offset(1, 0).Value = s
ThisWorkbook.Sheets("Main").Range("E" & Rows.Count).End(xlUp).Offset(1, 0).Value = s1
End If
Next
Set Workbook = Nothing
Workbooks(Filename).Close savechanges:=False
Filename = Dir()
Loop
End Sub
【问题讨论】:
单元格是工作表而不是工作簿的属性。 Added Sheets(1) ,它现在运行但冻结并且永远不会完成 你永远不会在Do
循环中改变j
的值——如果它进入它就没有办法退出。
为什么需要 Do 循环和紧随其后的 For 循环?他们似乎做着非常相似的事情。此外,&
是 VBA 中的字符串连接字符,而不是 +
添加了 j=j+1,仍然冻结 :( 摆脱了 Do 循环,只是注意到它什么也没做...我也更改了 & 用于连接,仍然冻结
【参考方案1】:
由于问题不清楚,因此假设仅基于图像中显示的数据。还假设每个文件只有第一张要合并
可以尝试根据您的要求修改代码
Sub Merge()
Dim Path As String, FileName As String, Wb As Workbook, Wm As Worksheet, Wt As Worksheet
Dim C As Range, MrgRw As Long, Sdate, STitle, SRoot, RwOff As Long, Txt As String
Dim lastRow As Long
Path = "C:\Users\user\Documents\Protocol\"
FileName = Dir(Path & "*xlsx")
Set Wm = ThisWorkbook.Sheets("Main")
lastRow = Wm.Range("A" & Rows.Count).End(xlUp).Row
Do While FileName <> ""
If FileName <> ThisWorkbook.Name Then
Set Wb = Workbooks.Open(FileName:=Path & FileName, ReadOnly:=True)
Wb.Worksheets(1).Copy After:=ThisWorkbook.Sheets(1)
Wb.Close False
Set Wt = ThisWorkbook.Sheets(2)
Sdate = Wt.Cells(7, 3).Value
STitle = Wt.Cells(2, 3).Value
Set C = Wt.Range("A1:A100").Find(ChrW(&H2116), LookIn:=xlValues) '
If Not C Is Nothing Then
RwOff = 1
Do While C.Offset(RwOff, 1).Value <> ""
SRoot = C.Offset(RwOff, 1).Value
lastRow = lastRow + 1
MrgRw = C.Offset(RwOff, 1).MergeArea.Rows.Count
Txt = ""
For i = 0 To MrgRw - 1
Txt = Txt & (i + 1) & "." & C.Offset(RwOff + i, 2).Value & vbCrLf
Next
Txt = IIf(Len(Txt) > 0, Left(Txt, Len(Txt) - 1), Txt)
Wm.Range("A" & lastRow).Value = FileName
Wm.Range("B" & lastRow).Value = STitle
Wm.Range("C" & lastRow).Value = Sdate
Wm.Range("D" & lastRow).Value = SRoot
Wm.Range("E" & lastRow).Value = Txt
RwOff = RwOff + MrgRw
Loop
End If
FileName = Dir()
End If
Loop
End Sub
【讨论】:
以上是关于获取 438 错误对象不支持此属性或方法的主要内容,如果未能解决你的问题,请参考以下文章
“对象不支持此属性或方法”试了很多方法,换了浏览器还是解决不了
VBA(Visual Basic):ComboBox(表单控件) - 对象不支持此属性或方法