Vba 如果没有整个文件路径,我怎么能只从提示符中取出单元格?

Vba 如果没有整个文件路径,我怎么能只从提示符中取出单元格?,vba,excel,Vba,Excel,我有一个脚本,其中我正在处理两个不同工作簿中的数据。一个是wbVendor,一个是wbImport。 代码以wbImport中的用户表单编写。 代码的一部分是提示用户单击wbVendor中的单元格。然后我需要这个选定单元格的列。现在的问题是,它将单元格与工作簿的整个路径合并。因此,与其只收取10美元,还不如收取“[2018 ARA产品清单(航空公司价格).xlsx]含详细信息的活动部件”$B$10 我用于此任务的代码如下所示: wbVendor.Activate wsVendor.Activat

我有一个脚本,其中我正在处理两个不同工作簿中的数据。一个是wbVendor,一个是wbImport。 代码以wbImport中的用户表单编写。 代码的一部分是提示用户单击wbVendor中的单元格。然后我需要这个选定单元格的列。现在的问题是,它将单元格与工作簿的整个路径合并。因此,与其只收取10美元,还不如收取“[2018 ARA产品清单(航空公司价格).xlsx]含详细信息的活动部件”$B$10

我用于此任务的代码如下所示:

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:对象不支持此属性或方法。