大家下午好,
我收到错误438 - 对象不支持以下属性或方法。
Cells(4 + Counter, i * Cells(2, 3).Value) =
Application.WorksheetFunction.VLookup(Cells(2, i * Cells(2, 3).Value).Value,
Workbooks(file).Range("$E$1:$N$20"),
Application.WorksheetFunction.Match(Cells(3, i * Cells(2, 3).Value).Value,
Workbooks(file).Range("$E$1:$R$1"), 0), False)
基本上我有一个从Excel以外的程序下载到我的计算机的文件 - CSV。在以前的代码中,我搜索最新文件(下载的文件),导入到Excel,每次文件被命名为不同的东西。然后我让单元格B1显示文件名(所以我稍后可以参考)。我有file = Range(" B1")。value并将其设置为字符串。
在这个打开的文件中,我需要搜索一个术语并返回该单元格右侧的几个值。我已经决定每个返回的值应该区别对待,因为标题可能会更改,因此我使用Match。在该过程检索到第二个文件中的数据后,我将计数器设置为增加,以便下次导入数据时,新检索的数据将转到下面的行,从而有效地创建时间序列。列的设置方式是因为我必须为多个组检索6个数据点,组的数量和可能的数据点会发生波动。单元格(2,3).Value是我需要检索的数据点的数量,因此我可以创建一个模板,其中每个组都放在工作表中,每个组的数据放在工作表中。
我不确定它是否在我的表达式或其他方面,但显然似乎是正确的让我难过。一旦我把它弄下来,我就可以将它扩展到我需要为所有组引入的其他变量。 非常感谢!
答案 0 :(得分:0)
我没有足够的代码/说明来完全理解您放置数据的位置。我对源代码和目标引用的代码部分有点困惑。
要明确的事情:
我假设您已经设置了循环,因此您可以调整以下示例,该示例演示了一些相关语法:
Option Explicit
Sub test()
Dim file As Workbook
Dim strPath As String
Dim wb As Workbook
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim counter As Long
Dim i As Long
Set wb = ThisWorkbook
Set ws1 = wb.Sheets("Sheet1") 'Adjust to where you are copying data too/assumes file name is in same sheet
strPath = "C:\Folder\" 'Location of CSVs
'Assume you have an actual loop set up
counter = 1 'Put here so example has a start value
i = 1 ' Put here so example has a start value
If IsFileOpen(strPath & ws1.Range("B1").Value & ".csv") Then
MsgBox "File already in use! Please close."
Exit Sub
Else
Set file = Workbooks.Open(strPath & ws1.Range("B1").Value & ".csv")
Set ws2 = file.Sheets(1)
With ws2
'Require a test for existence of value
If Application.WorksheetFunction.CountIf(.Range("$E$1:$N$20"), .Cells(2, i * .Cells(2, 3).Value).Value) > 0 Then
ws1.Cells(4 + counter, i * .Cells(2, 3).Value) =
Application.WorksheetFunction.VLookup( _
.Cells(2, i * .Cells(2, 3).Value).Value, _
.Range("$E$1:$N$20"), _
Application.WorksheetFunction.Match(.Cells(3, i * .Cells(2, 3).Value).Value, .Range("$E$1:$R$1"), 0), _
False)
End If
End With
file.Close SaveChanges:=False
End If
'Loop
'Tidy away variables e.g. set wb = nothing .....
End Sub
'Source of function: https://support.microsoft.com/en-us/help/291295/macro-code-to-check-whether-a-file-is-already-open
Function IsFileOpen(filename As String)
Dim filenum As Integer, errnum As Integer
On Error Resume Next ' Turn error checking off.
filenum = FreeFile() ' Get a free file number.
' Attempt to open the file and lock it.
Open filename For Input Lock Read As #filenum
Close filenum ' Close the file.
errnum = Err ' Save the error number that occurred.
On Error GoTo 0 ' Turn error checking back on.
' Check to see which error occurred.
Select Case errnum
' No error occurred.
' File is NOT already open by another user.
Case 0
IsFileOpen = False
' Error number for "Permission Denied."
' File is already opened by another user.
Case 70
IsFileOpen = True
' Another error occurred.
Case Else
Error errnum
End Select
End Function
就我个人而言,我更喜欢使用Mat Richardson给出的响应中使用Find的结构: [Excel VBA查找字符串1
您可以使用Find返回搜索文本的Range地址并存储在变量中,测试变量IS NOTHING,并使用offset将值向右移动。
答案 1 :(得分:0)
感谢您的回复。 似乎工作簿地址的修复解决了问题以及定义范围。 Dim i As Integer Dim x As String Dim y As String
x =范围(" B1") y =范围(" C1")
LookupRange =工作簿(x).Sheets(y).Range(" $ E $ 1:$ N $ 20") HeaderRange = Workbooks(x).Sheets(y).Range(" $ E $ 1:$ R $ 1")
我基本上循环,使用更改的引用单元格搜索下载的最新文件,并返回与某个标题对应的值。 关于错误处理。我认为过程中断足以提醒我出错了。它应该只能破解在查找中找不到的变量。我有一个包含第二张表中变量的预定义范围,我查看了。 工作簿是通过宏打开的,并且在进程正在工作然后关闭时保持打开状态,因此处理工作簿是否未打开应该不是真正的问题。 谢谢你的帮助