Excel VBA 输入框 - 选择范围(类型 8)但不是固定范围,即 A1 不是 $A$1

Posted

技术标签:

【中文标题】Excel VBA 输入框 - 选择范围(类型 8)但不是固定范围,即 A1 不是 $A$1【英文标题】:Excel VBA Inputbox - Select range (Type 8) but not as a fixed range i.e. A1 not $A$1 【发布时间】:2012-11-08 10:30:34 【问题描述】:

我目前在我的VBA 代码中有以下行用于Inputbox

Set myValues = Application.InputBox("Please select on the spreadsheet the first cell in the column with the values that you are looking for:", Type:=8)

但是,当我选择单元格时,它会自动输入,例如$A$1。是否可以更改此设置,而无需用户手动删除 $,以便 Inputbox 会自动将单元格引用选为 A1

它是自动化VLookup 宏的一部分,除了VLookup 值被固定在整个列中之外,它可以完美运行。

提前致谢。

更新 - 以下是完整代码:

Dim FirstRow As Long
Dim FinalRow As Long
Dim myValues As Range
Dim myResults As Range
Dim myCount As Integer

Sub VlookupMacroNew()  

Set myValues = Application.InputBox("Please select on the spreadsheet the first cell in the column with the values that you are looking for:", Default:=Range("A1").Address(0, 0), Type:=8)

Set myResults = Application.InputBox("Please select on the spreadsheet the first cell where you want your lookup results to start:", Type:=8)

myCount = Application.InputBox("Please enter the column number of the destination range:", Type:=1)

On Error Resume Next
myResults.EntireColumn.Insert Shift:=xlToRight
Set myResults = myResults.Offset(, -1)
FirstRow = myValues.Row
FinalRow = Cells(65536, myValues.Column).End(xlUp).Row

Range(myResults, myResults.Offset(FinalRow - FirstRow)).Formula = _
"=VLOOKUP(" & Cells(FirstRow, myValues.Column).Address & ", " & _
"'S:\Payroll\CONTROL SECTION\[Latest Data.xls]Sheet1'!$A$1:$B$100" & ", " & myCount & ", False)"

myValues 将开始于例如单元格 A2 但是,当我们使用动态列表时,我需要将查找值更改为 A3、A4、A5 等,因为公式被复制到列表中。通过使用 $A$2 的输入框,查找公式仅查看该单元格引用。

【问题讨论】:

我不明白您所说的“VLookup 值在整列中固定”是什么意思。将选定的单元格更改为相对地址非常容易,但了解更多有关如何使用它的信息会很有帮助,尤其是因为您无法按照自己的方式更改 InputBox 的行为。 我已更新描述以包含查找宏的完整代码 【参考方案1】:

正如 Tim 所说,您的问题不在于 InputBox。相反,当您一次为整个范围设置公式时,它会为每个单元格的公式使用FirstRow。理想情况下,您会使用.FormulaR1C1 来设置公式。这将允许您一次性使公式相对。

下面的解决方案只是修改您的代码以在第一个单元格中放置一个非相对地址,然后将其余单元格中的公式设置为等于第一个单元格中的公式。当您分配这样的公式时,它会使它们相对:

Sub VlookupMacroNew()

Set myValues = Application.InputBox("Please select on the spreadsheet the first cell in the column with the values that you are looking for:", Default:=Range("A1").Address(0, 0), Type:=8)
Set myResults = Application.InputBox("Please select on the spreadsheet the first cell where you want your lookup results to start:", Type:=8)
myCount = Application.InputBox("Please enter the column number of the destination range:", Type:=1)

On Error Resume Next
myResults.EntireColumn.Insert Shift:=xlToRight
Set myResults = myResults.Offset(, -1)
FirstRow = myValues.Row
FinalRow = Cells(65536, myValues.Column).End(xlUp).Row

Range(myResults, myResults.Offset(FinalRow - FirstRow)).Cells(1).Formula = _
"=VLOOKUP(" & Cells(FirstRow, myValues.Column).Address(False, False) & ", " & _
"'S:\Payroll\CONTROL SECTION\[Latest Data.xls]Sheet1'!$A$1:$B$100" & ", " & myCount & ", False)"
Range(myResults, myResults.Offset(FinalRow - FirstRow)).Formula = _
Range(myResults, myResults.Offset(FinalRow - FirstRow)).Cells(1).Formula
End Sub

【讨论】:

干杯道格,效果很好。我会牢记这条规则以备将来参考。【参考方案2】:

您的问题不在于 InputBox,而在于 Address() 方法的行为。

默认情况下,不带参数的Address() 返回一个绝对地址。

Cells(FirstRow, myValues.Column).Address(False,False)

将返回“非固定”范围地址。

【讨论】:

以上是关于Excel VBA 输入框 - 选择范围(类型 8)但不是固定范围,即 A1 不是 $A$1的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA取消输入框不返回false/exit sub

VBA-Excel ComboBox 具有条目列表,首先显示最后输入的值

将控件(ActiveX或非ActiveX)添加到图表(Excel VBA)

Excel VBA文本框以填充组合框

根据单选按钮选择组合(VBA Excel)用可变文本填充文本框

文本输入 Excel VBA 上的文本框文本消失 - 第 2 部分