Консультация № 176158
20.01.2010, 15:16
0.00 руб.
0 3 1
Здравствуйте уважаемые эксперты помогите пожалуйста с задачкой по Экселю, очень нужно
Разработать модуль для перевода числа из десятичной системы счисления в систему счисления с основанием p (2<=p<=16) и наоборот
Число в десятичной системе счисления должно храниться в виде числа, в системи счисления p в виде строки
При переводе числа из системы счисления p проверять корректность ввода данных
Пример такого перевода:

На рабочем листе разместить две кнопки для вызова модулей

Обсуждение

давно
Модератор
137394
1850
21.01.2010, 02:00
общий
это ответ
Здравствуйте, Верещака Андрей Павлович. Вот решение. Запустим Excel. Сервис-Макрос - Редактор Visual Basic - Insert - Module
Вставим приведенные ниже функции.
Закроем редактор VBA
Код:
Function DecToP(inNum As Long, inOsnova As Integer)
' Функция перевода десятиричного целого числа в число по другому основанию (2<=P<=16)
' inNum - исходное целое десятиричное число
' inOsnova - основание, в котором преобразуем число
' Функция вернёт строку с числом в новой системе, при некорректных данных строку #Аргументы!

If 2 <= inOsnova And inOsnova <= 16 Then
T = "0123456789ABCDEF" ' Cимволы для записи числа

sss = ""
iii = Abs(inNum)

Do
j = iii Mod inOsnova
iii = Int(iii / inOsnova)
sss = Mid(T, j + 1, 1) + sss
Loop While iii <> 0
If inNum < 0 Then sss = "-" + sss

DecToP = sss
Else
DecToP = "#Аргументы!"
End If

End Function

Function PToDec(inString, inOsnova As Integer)
' Функция перевода целого числа по произвольному основанию (2<=P<=16) в десятиричное
' inString- исходная строка по указанному основанию
' inOsnova - основание, из которого преобразуем число в десятиричное
' Функция вернёт число в десятиричной системе, при некорректных данных строку #Аргументы!

PToDec = "#Аргументы!"

If 2 <= inOsnova And inOsnova <= 16 Then
T = "0123456789ABCDEF" ' Cимволы для записи числа

sss = 0
iii = Trim(inString)
Znak = Mid(iii, 1, 1)
LString = Len(iii)

If Znak = "-" Or Znak = "+" Then
LString = LString - 1
iii = Mid(iii, 2, LString)
End If

iii = UCase(iii)

jjj = 1
If LString > 0 Then
For j = LString To 1 Step -1
kkk = Mid(iii, j, 1)
nnn = InStr(1, T, kkk)
If 1 <= nnn And nnn <= inOsnova Then
sss = sss + jjj * (nnn - 1)
jjj = jjj * inOsnova
Else
Return
End If
Next
If Znak = "-" Then sss = -sss
PToDec = sss
End If
End If

End Function
Делаем Вашу таблицу

В Вашем примере можно обойтись и без кнопок.
В клетке B3 можно написать формулу с функцией =DecToP(B1;B2)
В клетке B7 можно написать формулу с функцией =PToDec(B5;B6)

Получите результат сразу же, без нажатия каких-либо кнопок. Этот пример я разместил на Лист1

Но, чтобы работали кнопки (этот пример я разместил на Лист2
На строке меню Excel нажмём правую кнопку мыши и в ниспадающем меню выберем Элементы управления
Активизируем Режим конструктора, активируем элемент Кнопка, рисуем кнопку в нужном месте
щелкнем по получившемуся дважды,
В открывшемся окне в дополнение к имеющемуся напишем одну строку, чтобы получилось
Код:
Private Sub CommandButton1_Click()
Range("B3") = DecToP(Range("B1"), Range("B2"))
End Sub
Слева внизу в строке где Caption напишем Перевести,
в строке Font подберём шрифт
Убираем активацию режима конструктора, закроем панель конструктора
Проверим работу кнопки.

Аналогично со второй кнопкой
Получится
Код:
Private Sub CommandButton1_Click()
Range("B3") = DecToP(Range("B1"), Range("B2"))
End Sub

Private Sub CommandButton2_Click()
Range("B7") = PToDec(Range("B5"), Range("B6"))
End Sub

Всё!
Скачать пример можно здесь. Preobrazovanie_chisel.xls (36.0 кб)
Статья о переводе чисел из одной системы в другую.
5
Очень подробный, полный и понятный ответ, очень сильно мне помог. <br>Спасибо огромное автору ответа Megaloman<br>И вашему порталу в целом, за возможмость повышать свои знания.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
21.01.2010, 11:58
общий
Огромное Вам спасибо, вы очень мне помогли, обычно я задаю платные вопросы, просто на данный момен у меня трудности с финансами, я и не думал что на бсплатный смогу получить ответ. При первой возможности я вас отблагадарю, в долгу не останусь.
С Уважением Андрей
давно
Модератор
137394
1850
21.01.2010, 13:06
общий
При первой возможности я вас отблагадарю
- don't worry,be happy! - а оценку поставить - ничего не стоит...
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Форма ответа