Создать числовой префикс в VBA

#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, ну, этот способ определенно более эффективен, но это действительно не имеет значения для такой тривиальной задачи. Я рад, что вы смогли найти решение, которое хотели.