创建子例程的VBA项目

创建子例程的VBA项目,vba,input,subroutine,inputbox,Vba,Input,Subroutine,Inputbox,我有以下任务: 创建一个名为WherePutMe的子例程,要求用户输入行号和列字母,然后将所选内容的2,2位置放入该单元格 到目前为止我做到了 Sub Whereputme() Dim x as integer, y as string x= Inputbox ("Enter a row number") y= Inputbox ("Enter a column letter") z= selection.range("B2") End Sub 仍然缺少一些内容。如何将inpu

我有以下任务:

创建一个名为WherePutMe的子例程,要求用户输入行号和列字母,然后将所选内容的2,2位置放入该单元格

到目前为止我做到了

Sub Whereputme()
  Dim x as integer, y as string
  x= Inputbox ("Enter a row number")
  y= Inputbox ("Enter a column letter")
  z= selection.range("B2")
End Sub

仍然缺少一些内容。如何将inputbox输入与z链接?

您遇到的问题是您正在将
z
定义为某种东西,但您没有使用它

通过简单地删除代码的
z=
部分,您现在告诉VBA您希望发生一些事情,而不希望定义变量

您可能希望按照以下步骤将数字转换为字符串,以防在组合字符串和整数时出现问题

Sub Whereputme()
  Dim x As Integer, y As String
  x = InputBox("Enter a row number")
  y = InputBox("Enter a column letter")
  Cells(2, 2).Value = y & CStr(x)
End Sub

您有
End Sub
,但没有
Sub
语句。这就是全部代码吗?如果用户取消提示怎么办

假设你在一个标准模块中(例如,代码>模块1,BAS < /COD>),你希望它在顶部有<代码>选项“显式/代码”,然后<代码>子< /Cord>语句定义你需要执行的过程-考虑使它显式地<代码>公共< /代码>,也:

Option Explicit

Public Sub WherePutMe()
    'TODO
End Sub
也就是说,“Where put me”是一个可怕的过程名称。最佳实践是使用有意义的名称来传达代码的目的——由于过程做了一些事情,您希望它们的名称通常以动词开头

不合格,
InputBox
正在调用
VBA.Interaction.InputBox
,这是一个VBA标准库函数,提示用户输入字符串,用户可以取消该提示。发生这种情况时,您得到的是一个空字符串指针,隐式转换为空字符串-但是,用户可以很好地输入一个e空字符串并点击Ok,因此在验证输入之前,我们首先需要知道提示是如何被取消的

这很快就会变得复杂和混乱。我们可以将这种复杂性抽象为一个函数:

Private Function TryGetUserInput(ByVal prompt As String, ByRef result As String) As Boolean
    result = InputBox(prompt)
    TryGetUserInput = (StrPtr(result) <> 0)
End Function
避免编写假设过多的代码(错误的假设=>bug;想想任何给定的指令可能会如何失败,并抛出一个错误,导致一切付之一炬),并且毫不犹豫地将事情分解成小的、专门的过程和函数-就像上面的循环在其自己的
tryGetValidOmber
函数中看起来非常整洁,该函数返回
False
,如果用户取消,则返回
True
,否则,
ByRef
输出参数保持
Long
调用者可以直接使用的整数值:

Public Sub WherePutMe()
    Dim rowNumber As Long
    If Not TryGetValidRowNumber(rowNumber) Then Exit Sub

    Dim columnLetter As String
    If Not TryGetValidColumnLetter(columnLetter) Then Exit Sub

    Dim targetCell As Range
    Set targetCell = ActiveSheet.Range(columnLetter & rowNumber)

    'TODO consume the targetCell as needed
End Sub

你能解释一下“将选择的2,2位置放入该单元格”吗?这个问题需要进一步澄清“单元格”是什么“是指2,2位置中包含的内容?作为一个片段,也可以展示输出应该是什么样子,这将是很有帮助的。Thx的解释..因为我是一个初学者..还有很多要学的没有问题。这有帮助吗?只有代码的答案可能会解决问题,但如果你解释它们是如何解决的,它们会更有用。社区需要理论和代码来充分理解您的答案。
Option Explicit

Public Sub WherePutMe()
    Dim userRowInput As String, userRow As Long, isValid As Boolean
    Do While Not isValid
        If TryGetUserInput("Enter a row number", userRowInput) Then
            'user submitted a value, now validate it
            If IsNumeric(userRowInput) Then
                'looks legit
                userRow = CLng(userRowInput)
                '...but is it?
                isValid = userRow > 0
            End If
        Else
            'user cancelled the prompt
            Exit Sub
        End If

        If Not isValid Then MsgBox "Invalid row number. Please enter a positive integer between 1 and 1,048,576.", vbExclamation
    Loop
    'TODO: get and validate the column letter
End Sub
Public Sub WherePutMe()
    Dim rowNumber As Long
    If Not TryGetValidRowNumber(rowNumber) Then Exit Sub

    Dim columnLetter As String
    If Not TryGetValidColumnLetter(columnLetter) Then Exit Sub

    Dim targetCell As Range
    Set targetCell = ActiveSheet.Range(columnLetter & rowNumber)

    'TODO consume the targetCell as needed
End Sub