#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