2013-09-06 3 views
1

Я работаю над созданием макроса Excel с помощью VBA для преобразования строк бит в числа. Они не являются двоичными числами, каждый «1» означает собственный номер.Как преобразовать число бит в цифру

например: 1100000000000000000010001

с левой стороны, первый бит представляет собой «1», второй бит представляет «2», третий бит представляет собой «0», и так далее. Общее количество битов в каждой строке 25.

Я хочу VBA, чтобы преобразовать его и показать результаты, как так: 1, 2, 21, 25.

Я попытался с помощью текста по столбцам, но не был успешным.

+4

Вы можете использовать 'Mid()' для доступа к каждой цифре и конвертировать ее в соответствующий номер (вы можете хранить их в массиве или даже в диапазоне рабочих листов). Однако, если вы не знаете * любой * VBA, это на самом деле не место для изучения ... –

ответ

0

Еще не-VBA решение, основанное на OP 'и с макетом, предназначенным для облегчения множественных «конверсий» (то есть формулы копирования в соответствии с требованиями):

enter image description here

+1

В ячейке BZ есть опечатка. должно быть «= LEFT (BY1, LEN (BY1) -1)». Спасибо за помощь! –

+0

@ user2755335 Чтобы определить, что вы, должно быть, пробовали этот подход, к моему удивлению (и восхищению), признаюсь. Не ожидая никакого интереса, я не повторил формулы в удобном для копирования формате, за что я извиняюсь.Формула в BA1, которую я использовал, была '' = A1 & "," '(аналогичное пространство в BB1), то есть есть пространство, так что результаты будут« 1, 2, 21, ... ... а не «1,2,21 '... Следовательно, мое использование' -2'. Но без интервала '-1' действительно правильно и хорошо замечено! Существуют, однако, опечатки в строке 1 текста (отсутствующие' s' и в первом текстовом поле, отсутствует 'm'!) – pnuts

+0

Любая идея о том, как удалить« 0 »? –

1

попробовать что-то вроде этого:

Sub Execute() 
    Dim buff() As String 
    Dim i As Integer, total As Double 

    buff = Split(StrConv(<theString>, vbUnicode), Chr$(0)) 
    total = 0 

    For i = 0 To UBound(buff) 
     Debug.Print (buff(i)) 
     'total = total + buff(i) * ?? 
    Next i 
End Sub 
+1

привет @Makah, я использую Excel 2010. Я скопировал этот VBA и вставлял в модуль Excel при компиляции в VBA, появилась ошибка. 4-я строка показалась красной. –

+0

Привет @ user2755335, вам нужно изменить для вашей реальной строки «0001010101001011010» :-) – Makah

+0

Запуск этого, где я должен ожидать найти «1, 2, 21, 25'? – pnuts

0

ли это быть VBA? Дайте установку данных, как это:

Convert from bit string

Формула в ячейке B4 и скопировано до В33 является:

=IF(ROWS(B$3:B3)>LEN($B$1)-LEN(SUBSTITUTE($B$1,"1","")),"",FIND("@",SUBSTITUTE($B$1,"1","@",ROWS(B$3:B3)))) 

Эта формула клеток отформатированы как Генеральный и битовая строка ячейки (B1) форматируется как текст.

+0

спасибо @tigeravatar, это намного проще. но я не могу понять эту команду. если я хочу, чтобы результат отображался горизонтально, например: C1, C2 и т. д., какой параметр должен быть изменен? –

+0

Измените оба экземпляра 'ROWS (B $ 3: B3)' вместо 'COLUMNS (B $ 3: B3)', а затем вы можете скопировать право вместо down – tigeravatar

1

Рассмотрим:

Public Function BitPicker(sIn As String) As String 
    For i = 1 To Len(sIn) 
     If Mid(sIn, i, 1) = 1 Then 
      BitPicker = BitPicker & i & "," 
     End If 
    Next 
     BitPicker = Mid(BitPicker, 1, Len(BitPicker) - 1) 
End Function 
+0

Мне это нравится (+1), но будет некоторый «постоянный» вывод быть улучшением (или я не ищу в нужном месте)? – pnuts

+1

Hi pnuts: Я представил данные как ячейку, такую ​​как A1. = BitPicker (A1) будет введен в другую ячейку, и эта ячейка отобразит результаты (разделенные запятой) Спасибо за голосование! –

0

Попробуйте это:

Function ConvertMyRange(Rng As Range) As String 

    Dim MyString As String 
    MyString = Rng.Text 
    Dim OutPutString As String 

    For i = 1 To Len(MyString) 
     If Mid(MyString, i, 1) = "1" Then OutPutString = OutPutString & ", " & i 
    Next i 

    ' Get rid of first ", " that was added in the loop 
    If Len(OutPutString) > 0 Then 
     OutPutString = Mid(OutPutString, 2) 
    End If 

    ConvertMyRange = OutPutString 

    End Function 

Для вашего входа, выход 1, 2, 21, 25

Смежные вопросы