見出し画像

有効桁数1桁の16進数電卓をExcelVBAで作る (+-編)

先日キンエバの中尾師匠にTwitterで16進数の活用方法をつぶやいた時に、
私「16進数同士の電卓とか?!」
中尾師匠「そんな高度なことは💦」
というやり取りをしまして、確かにkintoneでは難しいです。
でも正の整数のみで有効桁数1桁のExcelなら簡単かも?とか思って、
勉強がてら作ることにしました。そもそも自分で言ったんだし。

特に役に立つものではなく、アヒルが歩くみたいな計算です。
会社で配列やFor文を説明すると皆顔色が悪くなるので、ExcelVBAで配列とFor文の使用例でとして見てもらえるといいかなと思ってます😁

kintoneでの中尾師匠の16進数変換

先日、kintone cafe 東京Vol.11でキンエバ中尾師匠が、標準機能で10進数をN進数に変換する方法を発表していました。
実際のデモ用kintone環境が用意されており、発表で使用されたアプリを触って見れたのですが、N進数が2以上10以下でした。
Twitterで中尾師匠に「16進数も考えてたりします?」と質問したところ、
ナントYouTube生ライブで
『16進数変換でRGBからカラーコードへ変換』をするとの発表が!
ただ時間は22時30分から、不安…。
不安は的中し、タブレットを抱えたままぐっすり寝てしまったのです。
ところが翌日朝にはアーカイブ動画が、華麗にアプリを作る動画を見て私も何か作りたいと思い、16進数電卓をExcelVBAで作ることにしました😁

目標の仕様

16進数の正で1桁の数をそれぞれセルに入力
+、-、×、÷ボタンで計算した結果が16進数で表示
割り算は商と余りを表示(×÷は別の記事です)
計算するのではなく結果に向かって0から1セルずつ移動

入力欄作成

Excelを開き空白のブックを作成し、Excelマクロ有効ブック形式で保存します。タイトルや入力欄を作成します。

B2セル 16進数電卓
B4セル 入力値1
D4セル 入力値2 
B5セルD5セル 画面上部[データ]⇒[データの入力規則]
データの入力規則 設定タブ
入力値の種類 リスト
元の値    1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 

画像1

計算実行ボタン用に、画面上部の[開発]⇒[挿入]⇒ボタンをクリックし、4つボタンを挿入します。

画像4

ボタン名はボタンを右クリックして、[テキストの編集]をクリックし、変更します。

画像3

ボタン1 キャプション + オブジェクト名 btnPlus
ボタン2 キャプション - オブジェクト名 btnMinus
ボタン3 キャプション × オブジェクト名 btnTimes
ボタン4 キャプション ÷ オブジェクト名 btnDevide

結果の表示先準備

1桁の16進数(0からF)同士の+ー×÷の計算結果は、10進数でいうと-15以上225(15×15)以下なので、10進数列の右列に16進数を表示します。
16進数への変換はExcelのDEC2HEX関数を使います。
16進数のマイナスって2の補数らしいです。私はよくわからないので、その辺りは他の詳しく書いてあるページを検索してください💦

B10セル 10進数
B11~B251セル -15から225
C10セル 16進数
C11セル =DEC2HEX(B11)
C12~C251セル C11セルをコピーして貼り付け
D12~D251セル 結果行に答え☆と表示
E12~E251セル 割り算で余りが出た際は余りを表示

画像4

算出方法

最初にゼロの位置から足し算の場合は下に引き算の場合は上に移動する。

 C5セル +または-
 結果セル範囲 D12:E251のデータを削除
 結果0のC26セルへ アクティブセル移動
 入力値1個 下へ アクティブセル移動
 入力値2個 下へ(+)または上(-) アクティブセル移動

N進数計算_1

ワークシートにコード入力

移動、初期化に関してはサブルーチンを作成しました。

'定数の宣言'
Private Const HEXADECIMAL As String = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E"  '16進数'
Private Const RANGE_NUM1 As String = "B5"           '数字1 セル位置'
Private Const RANGE_NUM2 As String = "D5"           '数字2 セル位置'
Private Const RANGE_OPERATOR As String = "C5"       '演算子 セル位置'
Private Const RANGE_RESULT_0 As String = "D26"      '結果の開始 セル位置'
Private Const RANGE_RESULT As String = "D11:E251"   '結果の範囲'

'足し算'
Private Sub btnPlus_Click()

   '結果部分を初期化'
   Call initResultArea("+")
   
   Call moveCell(Me.Range(RANGE_NUM1).Text, True) '数字1 下へ 移動'
   Call moveCell(Me.Range(RANGE_NUM2).Text, True) '数字2 下へ 移動'
   
   '結果表示'
   ActiveCell.Value = "答え☆"

End Sub

'引き算'
Private Sub btnMinus_Click()
   
   '結果部分を初期化'
   Call initResultArea("-")
   
   Call moveCell(Me.Range(RANGE_NUM1).Text, True)  '数字1 下へ 移動'
   Call moveCell(Me.Range(RANGE_NUM2).Text, False) '数字2 上へ 移動'
   
   '結果表示'
   ActiveCell.Value = "答え☆"

End Sub

'結果表示範囲を初期化する'
'initResultArea(演算子:+-×÷)'
Private Sub initResultArea(ByVal hstr_ope As String)
   
   Me.Range(RANGE_OPERATOR).Value = hstr_ope  '演算子セルに演算子表示'
   Me.Range(RANGE_RESULT).Delete              '結果の範囲'
   Me.Range(RANGE_RESULT_0).Activate          
   
End Sub

'ActiveCellを上か下へ移動します'
'moveCell(移動数16進数,True:下/False:上)'
Private Sub moveCell(ByVal hstr_number As String, _
                     ByVal hbln_Down As Boolean)
   
   Dim wArray As Variant
   Dim wNumber As Variant
   
   wArray = Split(HEXADECIMAL, ",")
   
   For Each wNumber In wArray
       
       If hstr_number = wNumber Then
           Exit For
       End If
       If hbln_Down Then
           ActiveCell.Offset(1, 0).Activate
       Else
           ActiveCell.Offset(-1, 0).Activate
       End If
   
   Next

End Sub

結果表示

数値1と数値2を入力して+またはーボタンを押すと結果の位置に
アクティブセルが移動し答え☆と表示されました🌞ホッ

画像6


いいなと思ったら応援しよう!