Использование ответа VBA Input Box в качестве переменной в коде - PullRequest
0 голосов
/ 26 августа 2018

У меня есть таблица данных (тысячи строк и в основном числовые значения), которые я хочу изменить форматирование в зависимости от того, кто является конечным пользователем. например иногда для отображения в виде целых чисел, иногда для отображения в миллионах с одним десятичным знаком. Я написал код, который перебирает диапазон ячеек и применяет определенный тип формата, назначенный во время выполнения макроса. У меня есть девять типов форматов, которые можно использовать, и для простоты я назначил синтаксис или текст, связанный с каждым типом формата, переменной. например

Когда я запускаю эту процедуру, я просто получаю доступ к коду в редакторе VB и набираю переменную, относящуюся к желаемому типу формата, например, введя «F7» в качестве переменной, тип формата, применяемый к моим данным, будет составлять миллионы без десятичных знаков. Когда я набираю код переменной (например, F7), макрос работает нормально.

Чтобы разрешить другим сотрудникам использовать этот макрос, я добавил поле ввода, которое запрашивает тип формата, который необходимо ввести, например, F3 или F7 и т. Д. Я затем (пытаюсь) использовать результат из поля ввода в моем коде. Предполагается, что код распознает F7 как предопределенную переменную и назначит определенный код форматирования. Однако в результате мой код не распознает значение из поля ввода как переменную, а скорее предполагает, что результат фактически является типом формата, и создает пользовательский тип формата F7, который, конечно, не имеет смысла, и значения моей ячейки в таблице покажите как «F7» в каждой ячейке, даже если в каждой ячейке по-прежнему существует базовое число.

Почему мой подход ввода не работает, во-вторых, есть ли лучший способ, чтобы пользователь мог выбрать, какой тип формата он хочет, без необходимости ввода кода VBA?

Моя проблема в самом низу кода, если я использую опцию 1 ниже, макрос работает отлично, если я использую опцию 2, которая использует метод inputbox, то проблема возникает:

  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 голосов
/ 26 августа 2018

Вы не можете назвать переменную из строки, возвращаемой InputBox.Вы можете создать массив строк и использовать номер справа, чтобы определить элемент массива для возврата в .NumberFormat.

DefaultValue2 = none должно быть DefaultValue2 = "none" или DefaultValue2 = vbnullstring.none без кавычек не имеет контекста в том, что вы пытаетесь.

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
...