Преобразование размеров файлов из байт в Кб или Мб

#vba #excel

#vba #excel

Вопрос:

У меня есть большое количество строк с разными значениями в нем, от 1000 до 1 000 000 с.

Это данные, которые мне попались в байтах, и мне нужно преобразовать их в Кб или Мб соответственно.

Я мог бы разделить все значения на 1 М и получить все данные в Мб, но я хочу иметь данные в кб и Мб.

Я пытался использовать функцию MOD, но это не сработает, так как все числа будут делиться на 1K и 1M, поэтому я немного застрял!

вот пример данных, которые я получаю:

 16000000
220000
2048000
2048000
230000
16000000
230000
16000000
220000
230000
  

итак, что мне нужно, так это то, что если ячейка содержит 6 нулей, то разделите на 1 м или, если ячейка содержит 3 нуля, разделите на 1000.

Я добавлю конкатенацию к каждому отдельному результату, чтобы дифференцировать данные.

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

1. Разве это не замена нулей? 16000000/1000000 =16

2. @Nathan_Sav да, и это будет 16 МБ, что я хочу отобразить в электронной таблице, а не 16 МЛН байт

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

Ответ №1:

Это та функция, которую вы ищете :

 Public Function SizeInStr(ByVal Size_Bytes As Double) As String
    Dim TS()
    ReDim TS(4)
    TS(0) = "b"
    TS(1) = "kb"
    TS(2) = "Mb"
    TS(3) = "Gb"
    TS(4) = "Tb"

Dim Size_Counter As Integer
Size_Counter = 0

    If Size_Bytes <= 1 Then
        Size_Counter = 1
    Else
        While Size_Bytes > 1
            Size_Bytes = Size_Bytes / 1000
            ''Or
            'Size_Bytes = Size_Bytes / 1024
            Size_Counter = Size_Counter   1
        Wend
    End If

    SizeInStr = Format(Size_Bytes * 1000, "##0.0#") amp; " " amp; TS(Size_Counter - 1)
    ''Or
    'SizeInStr = Format(Size_Bytes * 1024, "##0.0#") amp; " " amp; TS(Size_Counter - 1)
End Function
  

Используйте его просто так :

 Private Sub Test_SizeInStr()
   MsgBox SizeInStr(1000000)
End Sub
  

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

1. Пожалуйста, обратите внимание, что с 1998 года стандартом IEC (практически ISO) для преобразования килобайт, мегабайт и т. Д. Является 1000. 1024 называется кибибайт, мебибайт и т. Д.

2. @vacip : Спасибо за это, видимо, я уже довольно стар, я узнал это раньше и не имел ни малейшего понятия! ^^

3. Да, это тоже было шокирующим открытием для меня несколько лет назад… Самое интересное, что теперь царит полная путаница. Производители оборудования обычно используют 1000, в то время как разработчики программного обеспечения обычно используют 1024 (следовательно, вы покупаете жесткий диск емкостью 1 ТБ и получаете меньше (931 ГБ), когда вставляете его в свой компьютер).).

Ответ №2:

Если вы ищете какой-либо код VBA, вы можете использовать эту функцию:

 Public Function yourFunction(ByVal number)
  If number > 1000000 Then
    'number as MB
    yourFunction = number / 1000000
    'or use the following to add MB
    'yourFunction = (number / 1000000) amp; " Mb"
  Else
    'number in kB
    yourFunction = number / 1000
    'or use the following to add kB
    'yourFunction = (number / 1000) amp; " Kb"
  End if
End Function
  

Если вы ищете формулу Excel, вы можете использовать эту функцию (исходное значение в A1), поместите эту формулу в другой столбец (например, столбец B)

 =IF(A1>1000000,A1/1000000,A1/1000)
  

или с конкатенацией:

 =IF(A1>1000000,CONCATENATE(A1/1000000," Mb"),CONCATENATE(A1/1000," Kb"))
  

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

1. это было, приятель !.. блестяще! Спасибо!… все остальные ответы великолепны, но ваши — это именно то, что было у меня в голове, но я не мог воплотить в коде!

Ответ №3:

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

Этот числовой формат делает именно то, что вам нужно, но оставляет фактические числа нетронутыми в байтах, поэтому вы все равно можете использовать их в формулах:

 [>1000000]0,,"Mb";[>1000]0,"kb";0"b"
  

Обратите внимание, что это может зависеть от языка среды. Для меня с венгерскими региональными настройками вместо запятых должны использоваться пробелы:

 [>1000000]0  "Mb";[>1000]0 "kb";0"b"
  

Что делает пробел / запятая, так это то, что каждый из них «скрывает» три цифры с конца.

Ответ №4:

Для любого числа n примените это

 If n Mod 1000 = 0 Then
    n = n / 1000
End If
  

дважды. При первом запуске он преобразует миллионы в тысячи, а тысячи в единицы измерения. При втором запуске он преобразует любые тысячи в единицы.