#string #vba #numbers
#строка #vba #числа
Вопрос:
У меня есть несколько номеров версий, из которых мне нужно создать папки. Итак, допустим {4, 12, 534}
. Исходя из этого, мне нужно создать папки, которые можно отсортировать соответствующим образом;
004..
012..
534..
Итак, что мне нужно, так это получить наибольшее число, а затем посмотреть, сколько заполняющих нулей мне нужно для каждого foldername, чтобы они были правильно отсортированы после их создания.
Как я могу это сделать с помощью VBA (Excel)? Я попытался преобразовать их в строки, а затем разобраться со строковыми операциями, но это не совсем сработало.
Я надеюсь, что у кого-то есть хорошая идея для этого…
Комментарии:
1. Вы пытались использовать CInt (значение) перед сравнением?
Ответ №1:
Самый простой способ — с помощью Format
(или Format$
):
dim s As String
s = Format$(revNum, "000")
Использование "000"
в качестве «строки формата» указывает функции заполнять начальными нулями, тогда как "###"
указывает ей не заполнять. Разница между версиями функции заключается в типе возвращаемого значения: Format
возвращает вариант (String), в то время как Format$
возвращает фактическую строку.
Комментарии:
1. Это действительно здорово. Но это не описывает, как определить максимальное число, а затем использовать отступы разной длины. Тем не менее, приятно видеть такую функцию.
2. Предполагается, что вы заранее знаете максимальное количество мест, которые вы хотите заполнить — любое количество
"0"
заполнителей работает так же хорошо, при этом результирующая строка дополняется до этой длины. Значения, превышающие строку формата, не усекаются, хотя они, очевидно, не дополняются.
Ответ №2:
Проще всего предварительно вычислить максимальное значение, затем снова выполнить цикл и дополнить;
Dim nums() As String: nums = Split("4,12,534,9999", ",")
Dim i As Long
Dim max As Long
For i = 0 To UBound(nums)
If (Len(nums(i)) > max) Then max = Len(nums(i))
Next
For i = 0 To UBound(nums)
nums(i) = String(max - Len(nums(i)), "0") amp; nums(i)
Debug.Print nums(i)
Next
Комментарии:
1.
Len()
предполагается, что он дает мне длину переменной, верно? Но когда я это делаюDim Test As Integer: Test = 1
Len(Test)
, это дает мне2
? Как получилось?2. Поскольку целое число vba имеет 16 бит, то есть 2 байта, чтобы получить его длину в виде строки, вы должны использовать len(cstr(i))
Ответ №3:
Я не уверен, почему простая операция со строкой не сработает.
Select Case Len(folderstring)
Case 1
folderstring = "00" amp; folderstring
Case 2
folderstring = "0" amp; folderstring
Case Else
' Do nothing here
End Case
или
Dim zeroarray(1 To 3) As Variant
zeroarray = Array("00","0","")
folderstring = zeroarray(Len(folderstring)) amp; folderstring
Комментарии:
1. @ApoY2k, ну, этот способ определенно более эффективен, но это действительно не имеет значения для такой тривиальной задачи. Я рад, что вы смогли найти решение, которое хотели.