Vba 如果没有整个文件路径,我怎么能只从提示符中取出单元格?
我有一个脚本,其中我正在处理两个不同工作簿中的数据。一个是wbVendor,一个是wbImport。 代码以wbImport中的用户表单编写。 代码的一部分是提示用户单击wbVendor中的单元格。然后我需要这个选定单元格的列。现在的问题是,它将单元格与工作簿的整个路径合并。因此,与其只收取10美元,还不如收取“[2018 ARA产品清单(航空公司价格).xlsx]含详细信息的活动部件”$B$10 我用于此任务的代码如下所示:Vba 如果没有整个文件路径,我怎么能只从提示符中取出单元格?,vba,excel,Vba,Excel,我有一个脚本,其中我正在处理两个不同工作簿中的数据。一个是wbVendor,一个是wbImport。 代码以wbImport中的用户表单编写。 代码的一部分是提示用户单击wbVendor中的单元格。然后我需要这个选定单元格的列。现在的问题是,它将单元格与工作簿的整个路径合并。因此,与其只收取10美元,还不如收取“[2018 ARA产品清单(航空公司价格).xlsx]含详细信息的活动部件”$B$10 我用于此任务的代码如下所示: wbVendor.Activate wsVendor.Activat
wbVendor.Activate
wsVendor.Activate
Set CellPN = wsVendor.Application.InputBox _
(prompt:="Click in a cell which contains the part number in the vendors file.", Type:=8)
CellPN.Select
ColumnPN = CellPN.Column
然后执行此代码时,会出现以下错误消息:
运行时错误“1004”:
选择范围类的方法失败
为了更好地理解,我附上了一张提示图片,其中包含整个文件名的单元格
已经谢谢你的帮助了。我真的很感激!!
要直接解决手头的问题:
wbVendor.Activate
wsVendor.Activate 'assuming this is the worksheet contained in the workbook above,
'the line above is redundant and not necessary
Dim cellPN as string
cellPN = wsVendor.Application.InputBox _
(prompt:="Click in a cell which contains the part number in the vendors file.", Type:=8)
Dim result() as String
result = Split(CellPN, "!")
ColumnPN = wsVendor.Range(result(1)).Column
Split
函数允许您在bang(!)处分解InputBox函数返回的字符串,bang(!)是文件名/工作表和实际单元格引用之间的分隔符。这将返回一个由2个字符串组成的数组,第一个result(0)
是文件名/工作表,第二个result(1)
是实际的单元格引用
从那里,您可以要求工作表.Range()
函数返回您提供的单元格引用的列
尽管您可能想在这里阅读一些关于如何以及为什么应该避免。激活和。尽可能不惜一切代价选择。尝试以下方法:
Dim ColumnPN As Long
Dim CellPN As Range
Dim wsVendor As Worksheet
Dim wb as Workbook
wbName = Application.GetOpenFilename
If wbName <> False Then
Set wb = Workbooks.Open(wbName)
End If
Set wsVendor = wb.Sheets(1)
wsVendor.Activate
Set CellPN = Application.InputBox(prompt:="Select a Cell", Type:=8)
ColumnPN = wsVendor.Range(CellPN.Address).Column
Dim columnp尽可能长
Dim CellPN As范围
将供应商定义为工作表
将wb设置为工作簿
wbName=Application.GetOpenFilename
如果wbName为False,则
设置wb=工作簿。打开(wbName)
如果结束
设置wsVendor=wb.Sheets(1)
wsVendor.Activate
Set CellPN=Application.InputBox(提示:=“选择单元格”,类型:=8)
ColumnPN=wsVendor.Range(CellPN.Address).Column
以选择范围;范围所在的工作表必须处于活动状态。表示包含该工作表的工作簿也必须处于活动状态:
Sub PickaCell()
Dim w As Workbook, s As Worksheet, CellPN As Range
Set CellPN = Application.InputBox(prompt:="Click in a cell which contains the part number in the vendors file.", Type:=8)
Set s = CellPN.Parent
Set w = s.Parent
w.Activate
s.Select
CellPN.Select
End Sub
现在还不清楚您到底想实现什么,但以下几点应该可以实现:
wbVendor.Activate
wsVendor.Activate
Set CellPN = wsVendor.Application.InputBox _
(prompt:="Click in a cell which contains the part number in the vendors file.", Type:=8)
CellPN.Parent.Parent.Activate 'Activate the workbook of CellPN
CellPN.Parent.Select 'Select the worksheet of CellPN
CellPN.Select 'Select CellPN
ColumnPN = CellPN.Column
AddressPN = CellPN.Address
您看到的错误是由于您在不同的工作表和/或工作簿上选择了一个单元格
address pn
应包含CellPN
的地址作为文本。首先感谢大家的帮助。现在我的代码工作得很好。对于感兴趣的人,这是最终代码:
wbVendor.Activate
wsVendor.Activate
Set CellPN = wsVendor.Application.InputBox _
(prompt:="Click in a cell which contains the part number in the vendors file.", Type:=8)
CellPN.Parent.Parent.Activate 'Activate the workbook of CellPN
CellPN.Parent.Activate 'Select the worksheet of CellPN
ColumnPN = CellPN.Column
再次感谢
干杯,
Dominic是否ColumnPN
不包含您要查找的列号?关于CellPN.Address
?那不行吗?还有一个选项,我猜输入框“冻结”代码的执行,直到用户在wbVendor
中选择一个单元格。那么,也许ActiveCell.Address
不起作用?也许只需要$B$10
。你试过了吗?谢谢你的评论。我忘了告诉你发生了一个错误。我只是把它添加到我的问题中。很抱歉,非常感谢你的回答。现在又出现了一个新问题。在现在定义列号的行中,出现运行时错误9,即“下标超出范围”。在VBE的即时窗口(Ctrl-G)中键入?结果(0)
和?结果(1)
。你得到了什么结果<代码>?结果(1)
应返回您要查找的实际单元格地址。例如,如果您得到“$B$10”,则必须使用一些字符串格式将其重新格式化为“B:10”。出于某种原因,InputBox
接受单元格的值,而不是地址,即使您在单元格中单击时显示了地址。所以当我输入?结果(0)
时,它会显示单元格中的值。啊!这意味着选择细胞的方法不会像你(和我)想象的那样有效。我建议使用的方法,因为他的AddressPN
将为您提供实际的单元格地址。你好,Irene G。此代码导致错误9:对象变量或未设置块变量。我没有给我造成错误。。。您是如何定义您的供应商的?我将添加一些关于我是如何操作的代码…也许您需要添加对工作簿的引用,以便让用户使用Application.FileDialog(msoFileDialogFilePicker)
通过提示对话框和wb引用编辑代码。。。希望有帮助!嗨,克莱尔。谢谢你的回答。不同的变量必须是什么维度?我把CellPN作为射程,把ColumnPN作为长度。这会产生运行时错误“91”:未设置对象变量或带块变量。很抱歉,我的意思是1004:工作表类的Select方法失败。AddressPN
应为字符串。也许可以尝试将CellPN.Parent.Select更改为CellPN.Parent.Activate
?已尝试此操作。现在又出现了一个错误。438:对象不支持此属性或方法。