将VBA输入框答案用作代码中的变量

时间:2018-08-26 00:08:14

标签: excel excel-vba

我有一个数据表(成千上万的行,主要是数字值),我想根据最终用户的身份更改格式。例如有时显示为整数,有时显示为数百万个小数点后一位。我编写了遍历单元格范围并应用在运行宏时分配的某种格式类型的代码。我有九种可以使用的格式类型,为简便起见,我已将与每种格式类型相关的语法或文本分配给了变量。例如

运行此过程时,我只需要在VB编辑器中访问代码,然后输入与所需格式类型相关的变量即可,例如通过输入“ F7”作为变量,应用于我的数据的格式类型将为数百万,无小数。当我输入可变代码(例如F7)时,宏可以正常工作。

为允许其他人员使用此宏,我添加了一个输入框,要求输入格式类型,例如F3或F7等...然后,我(尝试)使用代码中“输入框”的结果。目的是使代码将F7识别为预定义变量,并分配已定义的格式代码。但是,结果是我的代码无法将输入框中的值识别为变量,而是假设结果实际上是一种格式类型,并创建了F7的自定义格式类型,这当然毫无意义,并且我的单元格值即使每个单元格中仍存在基础编号,该表中的单元格中的每个单元格仍显示为“ F7”。

为什么我的输入框方法不起作用,其次,还有一种更好的方法让用户无需输入VBA代码即可选择他们想要的格式类型吗?

我的问题在代码的最底部,如果我在宏下面使用选项1则运行良好,如果我使用使用inputbox方法的选项2,则会出现问题:

  1. Selection.NumberFormat = F7(这很不错)
  2. Selection.NumberFormat = var_FormatCode(这行不通!)

下面是相关代码的副本:

Sub xx3()
' CHANGE P&L ROW FORMATS - INCLUDE USER INPUT BOXES

'Declare Variables
Dim x As Integer 'number of rows this macro applies to

Dim F1 As String
Dim F2 As String
Dim F3 As String
Dim F4 As String
Dim F5 As String
Dim F6 As String
Dim F7 As String
Dim F8 As String
Dim F9 As String

'Define/Set variables for "Format Types"
F1 = "#,##0_);[Red](#,##0);-"
F2 = "#,##0.0_);[Red](#,##0.0);-"
F3 = "#,##0.00_);[Red](#,##0.00);-"
F4 = "#,##0,_);[Red](#,##0,);-"
F5 = "#,##0.0,_);[Red](#,##0.0,);-"
F6 = "#,##0.00,_);[Red](#,##0.00,);-"
F7 = "#,##0,,_);[Red](#,##0,,);-"
F8 = "#,##0.0,,_);[Red](#,##0.0,,);-"
F9 = "#,##0.00,,_);[Red](#,##0.00,,);-"

'Declare variables for "Format Type" InputBox
Dim Prompt2 As String
Dim Caption2 As String
Dim DefaultValue2 As String
Dim var_FormatCode As String

'Define/Set variables for "Format Type" InputBox
Prompt2 = "Enter **Format Type Code** to use....."
Caption2 = "User Data Request - Input Box....."
DefaultValue2 = none

'Prompt User for Row Type & Format Code
var_FormatCode = InputBox(Prompt2, Caption2, DefaultValue2)

For x = 1 To 1000 'Number of rows this macro covers

    If Cells(x, 5) = 1 Then ' macro only applies formats to rows with a "1"
        Range(Cells(x, 16), Cells(x, 100)).Select
        Selection.NumberFormat = var_FormatCode
    End If
Next x

Range("A1").Select

End Sub

下面是我使用inputBox时表格的显示方式

enter image description here

1 个答案:

答案 0 :(得分:3)

您不能从InputBox返回的字符串中命名变量。您可以创建字符串数组,并使用右侧数字确定要返回到.NumberFormat的数组元素。

DefaultValue2 = none应该是DefaultValue2 = "none"DefaultValue2 = vbnullstringnone(不带引号)与您尝试的内容无关。

Dim F As variant

'Define/Set variables for "Format Types"
F = array("#,##0_);[Red](#,##0);-", "#,##0.0_);[Red](#,##0.0);-", "#,##0.00_);[Red](#,##0.00);-", _
          "#,##0,_);[Red](#,##0,);-", "#,##0.0,_);[Red](#,##0.0,);-", "#,##0.00,_);[Red](#,##0.00,);-", _
          "#,##0,,_);[Red](#,##0,,);-", "#,##0.0,,_);[Red](#,##0.0,,);-", "#,##0.00,,_);[Red](#,##0.00,,);-")

...
Dim DefaultValue2 As String
Dim var_FormatCode As String

...
DefaultValue2 = "none"

var_FormatCode = InputBox(Prompt2, Caption2, DefaultValue2)

if isnumeric(right(var_FormatCode, 1)) then
    'the array is zero-based; i.e. the first element is F(0)
    If Cells(x, 5) = 1 Then ' macro only applies formats to rows with a "1"
        Range(Cells(x, 16), Cells(x, 100)).NumberFormat = F(cint(right(var_FormatCode, 1))-1)
    end if
end if