Как мне изменить форматирование чисел в массиве в VBA

#excel #vba

#excel #vba

Вопрос:

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

Мой код выглядит следующим образом:

 Dim i as long
Dim x as long
Dim RoundedAmounts (1 to 26) as long
    
    for i = 1 to 26
      x= range("I44").offset(i,0).value
      if abs(x) < 150000
           RoundedAmounts(i)=0
      else 
           RoundedAmounts(i)=Application.WorksheetFunction.Round(x, -5)
      end if
     Next i
  

Я новичок в программировании, поэтому я не уверен, что это очевидная задача, но, похоже, я не смог найти ответ в Google. Я был бы очень признателен за любую помощь!

Комментарии:

1. Форматирование обычно применяется к тому, что вы хотите отобразить. Где и как вы отображаете эти значения?

2. Итак, в моем приведенном выше коде округления некоторые числа были округлены, например, 300000. Я хотел бы иметь эти числа в виде миллионов долларов США, поэтому в предыдущем примере это 0,3 миллиона долларов, то есть 300000.

3. @SuperSymmetry моя конечная цель — создать своего рода автоматический комментарий, который использовал бы эти округленные числа из моего массива. Я думаю, что этот шаг форматирования будет последним шагом, когда я соберу отображение. Спасибо за вашу помощь.

4. «Храните числа в том формате, в котором они вам нужны» — это логика защиты от Excel. Excel хранит число в его исходном и самом элементарном формате. Основная логика заключается в том, что вам наплевать на формат, пока вы его не увидите. Возможно, лучшим примером этого является значение даты / времени, подобное 44057.733333321. Вы можете отобразить это как чч: мм: сс или чч: мм или дд мммм, гггг или просто значение dddd. Вместо сохранения всех 57 вариантов Excel позволяет вам сохранить только один и выбрать отображение, когда вы захотите его просмотреть. То же самое для чисел и их форматов и округленных версий.

Ответ №1:

Число и его представление — это две разные вещи.

Ваш массив содержит Long (32-разрядное целое число со знаком) значения, и это все, что вам нужно, если вы намерены хранить значения, а не их представление.

Если вам нужен массив, содержащий строковое представление (например, $0.3MM вместо 300000 ) этих числовых значений, то вы не можете сохранить их в Long , для этого вам нужен String .

Допустим, у вас есть numbers массив, содержащий Long целые числа. Вы могли бы определить formattedNumbers массив, содержащий String элементы, и использовать VBA.Strings.Format$ функцию (и немного простой математики) для форматирования числовых значений любым нужным вам способом; используя строку формата, которая выглядит как $0.0MM , вы могли бы представить значение 300000 (разделенное на 1 миллион) $0.3MM следующим образом:

 Dim formattedNumbers(1 To 26) As String
Dim i As Long
For i = 1 To 26
    formattedNumbers(i) = Format$(numbers(i)/1000000, "$0.0MM")
Next
  

Но вам очень редко требуется строковое представление числа в логике программы: чаще всего вы хотите, чтобы ваш код работал с необработанными числовыми значениями, а затем форматировал эти значения в самую последнюю минуту, только когда пользователю нужно их увидеть.

Если это так, то вам не нужен массив строк; вы просто используете выходные данные Format$(numbers(i)/1000000, "$0.0MM") везде, где вы хотите отобразить это строковое значение; например, какой-нибудь TextBox элемент управления.

Если ваш вывод на самом деле представляет собой ячейку рабочего листа / a Range , то вы можете записать числовое значение в ячейку (разделите его на 1 миллион, если вы хотите отобразить миллионы), а затем установите для NumberFormat свойства ячейки пользовательский формат числового значения в соответствии с вашими требованиями.

Комментарии:

1. Отличный ответ! Единственное, что Long число в vba — это 64-разрядное целое число со знаком, как упомянуто здесь learn.microsoft.com/en-us/dotnet/visual-basic /…

2. @SuperSymmetry спасибо! но нет, это . Сетевая документация. Long является 32-разрядным целым числом со знаком в VBA и VB6 =)

3. Вы абсолютно правы, спасибо за разъяснение. Я всегда предполагал, что он 64-разрядный, как и в большинстве языков программирования.

4. @SuperSymmetry да, это так — за исключением того, что VB намного предшествует 64-разрядным процессорам, и в 16-разрядную эпоху появились 32-разрядные процессоры! Integer таким образом, это 16-разрядный целочисленный тип со знаком ( short на других языках), Long это 32-разрядный тип ( integer на других языках) и LongLong был введен в VBA7 для поддержки 64-разрядных целых чисел в 64-разрядных системах ( long на других языках).

5. Большое спасибо за информацию: думаю, мне никогда не требовалось целое число, которое не умещается в 4 байта в vba 🙂

Ответ №2:

Это должно хранить форматированные строки для вас

 Sub FormatedVals()
    
    Dim i As Long
    Dim vRoundedAmounts As Variant
    
    ' copy into a 2d value (26 rows and 1 column)
    vRoundedAmounts = ThisWorkbook.Sheets("Sheet1").Range("I45:I70").Value
    
    For i = 1 To UBound(vRoundedAmounts, 1)
        If Abs(vRoundedAmounts(i, 1)) < 150000 Then
            vRoundedAmounts(i, 1) = 0
        Else
            vRoundedAmounts(i, 1) = Round(vRoundedAmounts(i, 1) / 1000000, 1)
        End If
        vRoundedAmounts(i, 1) = Format(vRoundedAmounts(i, 1), "$0.0") amp; "m"
    Next i

End Sub