ドリル作成ツール VB6 |
3.共通処理
オブジェクト(部品)と関係しない処理で、ドリル作成ツールで共通に利用できるプロシージャである。
次のようにして追加した標準モジュールにプログラムする。標準モジュールのオブジェクト名をDrillSub、ファイル名をDrillSub.BASとしている。
[プロジェクト(P)] → [標準モジュールの追加(M)] → 標準モジュール
ほかのテーマのドリル作成ツールをプログラムするときは、このDrillSub.BASを追加すればよい。
前提条件 オリジナルの問題データ(BTextiに記憶させるデータ)に関して (1) 問題と解答の区切りとして"#-----解答-----"が1行挿入されている。また、データの最後の印に"##"が挿入されている。 (2) 問題と解答のデータには、各問([1]など)の後に"ア"(半角のア)、各問題(【1】など)の後に"イ"(半角のイ)が付けてある。 【】、[]や半角カタカナを目印にHTMLのタグを挿入している。半角カタカナはブラウザで表示するのに適さない文字なので目印として利用している。 (3) 表示すべき半角空白はすべて に置き換えるので、 に置き換えたくない半角空白は"ウ"(半角のウ)で表す。 |
定数の定義とグローバル変数の宣言 | ||
テキスト整形 | Public Function Text2HTMLjs(ByVal ptext As String) As String | テキストをHTML化(JAVAScript付き) |
Private Function KaiLen(pt As Long, txt As String) As Integer | 解答の文字数を返す。 | |
Private Function GetKai(pt As Long, txt As String) As String | 解答を返す。 | |
Public Function Text2HTML(ByVal ptext As String) As String | テキストをHTML化 | |
Public Function Text2Text(ByVal ptext As String) As String | テキスト化 | |
設定ファイル | Public Sub ReadHTML() | HTMLデータ読み込み |
Public Function iniFileRead(fname As String, keyw As String) As String | iniファイルの読み込み | |
Public Sub iniFileWrite(fname As String, keyw As String, dat As String) | iniファイルへの書き込み | |
ファイル操作 | Public Function BaseName(ByVal fname As String) As String | ファイル名の取得 |
Public Function PathName(ByVal fname As String) As String | パス名の取得 | |
Public Function isFile(fname As String) As Boolean | ファイルの存在の有無を返す | |
乱数 | Public Sub InitRansuu(nn As Long) | 同じ乱数系列のための初期化 |
Public Function Ransuu(min As Long, max As Long) As Long | 指定範囲の整数の乱数を返却する。 | |
Public Sub RansuuN(ko As Integer, arry() As Double, min As Long, max As Long) | 指定範囲の整数の乱数を複数個作成する。 | |
基数変換 | Public Function Dec2Hex(ByVal dat As Double) As String | 10→16進数文字列変換 |
Public Function Hex2Dec(ByVal dat As String) As Double | 16→10進数文字列変換 | |
Public Function Dec2Bin(ByVal dat As Double) As String | 10→2進数文字列変換 | |
Public Function Bin2Dec(ByVal dat As String) As Double | 2→10進数文字列変換 |
定数の定義とグローバル変数の宣言
Option Explicit 'グローバル '−=−=− 定数 −=−=− Public Const COPYRIGHT As String = "Copyright (C) 2003 Hiroshi Masuda" Public Const KAKKO1 As String = "【】" Public Const KAKKO2 As String = "[]" Public Const DQ As String = """" '−=−=− 変数 −=−=− Public MainForm As Object 'メインフォーム Public TChangeF As Boolean 'テキスト(問題)変更有り/無しフラグ Public BText As String 'テキスト(問題)オリジナル保存 Public USAGE As String '使用法 'sHTML(1)=先頭、sHTML(0)=JAVAScript、sHTML(2)=中間、sHTML(3)=最後 Public sHTML(3) As String 'HTMLデータ[1023][123] ,(0)=script data Public aFolder As String 'アプリフォルダ Public sFolder As String '作業フォルダ Public IniFile As String 'アプリ用INIファイル
配列sHTMLには、挿入用のHTMLタグを記憶させる。sHTML(0)はJAVAスクリプト(解答チェックなど)、sHTML(1)は<HTML>などの先頭部分、sHTML(2)は<BODY>などの中間部分、sHTML(3)は</HTML>などの最終部分である。HTML(表示)には配列sHTMLの(1)(2)(3)を、HTML(自習)には配列sHTML(1)(0)(2)(3)を挿入する。
配列sHTMLに記憶させるHTMLタグは"DrillSub.ini"ファイルに用意する。ファイルの内容については次のページで説明する。
Text2HTMLjs … テキストをHTML化(JAVAScript付き)
Public Function Text2HTMLjs(ByVal ptext As String) As String '--=*=----=*=----=*=----=*=----=*=-- 'テキストをHTML化(JAVAScript付き) ' 引数:ptext(String型) … テキストデータ(問題) ' 返却値:String型 … HTMLタグが挿入されたデータ ' ' 問題と解答の境界に "#--" 、解答の終わりに "##" をデータとして入れておく。 ' 画像ファイル名は "IMG=filename" の形式とする。filenameは""ではさまない。 '--=*=----=*=----=*=----=*=----=*=-- Dim sdat As String, kai As String, wk As String Dim mnum As String, tag As String, list As String Dim pt As Long, ptk As Long, klen As Integer If ptext = "" Then Text2HTMLjs = "" Exit Function End If '問題と解答分割 pt = InStr(ptext, "#--") '解答開始 kai = Mid(ptext, pt) '解答データ sdat = Left(ptext, pt - 1) '問題データ 'TAG挿入 pt = InStr(sdat, Left(KAKKO1, 1)) 'FORMタグ("【"を探してFORMタグを挿入) Do Until pt = 0 mnum = "m" & Trim(Str(Val(Mid(sdat, pt + 1)))) '問題データから問題番号取得 tag = "<FORMウname=" & DQ & mnum & DQ & ">" sdat = Left(sdat, pt - 1) & tag & Mid(sdat, pt) pt = InStr(pt + Len(tag) + 1, sdat, Left(KAKKO1, 1)) Loop pt = InStr(sdat, "ア") 'INPUTタグ 解答欄(半角のアを探してINPUTタグを挿入) ptk = InStr(kai, "ア") klen = KaiLen(ptk, kai) Do Until pt = 0 '↓DO-LOOP内の半角のウは空白の意味である。 tag = " → <INPUTウsize=" & DQ & Trim(Str(klen)) & DQ & "ウtype=" & DQ & "text" & DQ & ">ウ" tag = tag & "<INPUTウsize=" & DQ & "3" & DQ & "ウtype=" & DQ & "text" & DQ & "ウvalue=" & DQ & DQ & ">" sdat = Left(sdat, pt - 1) & tag & Mid(sdat, pt) pt = InStr(pt + Len(tag) + 1, sdat, "ア") ptk = InStr(ptk + 1, kai, "ア") klen = KaiLen(ptk, kai) Loop pt = InStr(kai, Left(KAKKO1, 1)) 'BUTTONタグ(解答チェックと正解ボタン及び処理の作成) mnum = "m" & Trim(Str(Val(Mid(kai, pt + 1)))) '解答データから問題番号取得 ptk = InStr(pt + 1, kai, vbCrLf) wk = Mid(kai, pt + 1, ptk - pt) Do Until pt = 0 tag = "<BR><BR><INPUTウtype=" & DQ & "button" & DQ & "ウvalue=" & DQ & "解答チェック" & DQ tag = tag & "ウonclick=" & DQ & "ans=newウArray(" list = "" ptk = InStr(wk, "ア") Do Until ptk = 0 '解答リスト作成 list = list & "'" & GetKai(ptk, wk) & "'," ptk = InStr(ptk + 1, wk, "ア") Loop list = Left(list, Len(list) - 1) tag = tag & list & ");" tag = tag & "ウAnswerCheck(document." & mnum & ",ウans,ウ0);" & DQ tag = tag & "> <INPUTウname=" & DQ & "ten" & DQ & "ウsize=" & DQ & "3" tag = tag & DQ & "ウtype=" & DQ & "text" & DQ & "ウvalue=" & DQ & DQ & ">点 " tag = tag & "↓ウ<INPUTウtype=" & DQ & "button" & DQ & "ウvalue=" & DQ & "正 解" & DQ tag = tag & "ウonclick=" & DQ & "ans=newウArray(" & list & ");ウAnswerDisplay(document." tag = tag & mnum & ".kai,ウans);" & DQ & "><BR><TEXTAREAウrows=" & DQ & "3" & DQ tag = tag & "ウcols=" & DQ & "50" & DQ & "ウname=" & DQ & "kai" & DQ tag = tag & "ウreadonly></TEXTAREA></FORM>" ptk = InStr(pt, sdat, "イ") '↓BUTTONタグの挿入(半角のイを探して挿入) sdat = Left(sdat, ptk - 1) & tag & Mid(sdat, ptk + 1) pt = InStr(pt + 1, kai, Left(KAKKO1, 1)) mnum = "m" & Trim(Str(Val(Mid(kai, pt + 1)))) '問題番号 ptk = InStr(pt + 1, kai, vbCrLf) wk = Mid(kai, pt + 1, ptk - pt) Loop sdat = Text2HTML(sdat) pt = InStr(sdat, "</HEAD>") sdat = Left(sdat, pt - 1) & sHTML(0) & Mid(sdat, pt) 'script挿入 pt = InStr(sdat, "ウ") 'ウ Do Until pt = 0 '半角のウを空白に変換 sdat = Left(sdat, pt - 1) & " " & Mid(sdat, pt + 1) pt = InStr(pt + 1, sdat, "ウ") Loop Text2HTMLjs = sdat '返却値 End Function
KaiLenプロシージャは解答部分の文字数(長さ)を返却する。GetKaiプロシージャは解答部分を返却する。
Text2HTMLプロシージャは問題と解答のデータにHTML(表示)用のタグを挿入する処理である。
KaiLen … 解答の文字数を返す。
Private Function KaiLen(pt As Long, txt As String) As Integer '--=*=----=*=----=*=----=*=----=*=-- '解答の文字数を返す。 ' 引数:pt(Long型) … 検索開始位置 ' txt(String型) … 被検索文字列 ' 返却値:Integer型 … 文字数 '--=*=----=*=----=*=----=*=----=*=-- Dim cnt As Integer, ch As String If pt = 0 Then KaiLen = 0 Exit Function End If cnt = 1 ch = Mid(txt, pt - cnt, 1) Do Until ch = Right(KAKKO2, 1) 'KAKKO2="[]" cnt = cnt + 1 ch = Mid(txt, pt - cnt, 1) Loop KaiLen = cnt End Function
各解答末尾の半角のアの位置(引数pt)から問番号([n])の"]"までの長さをカウントしている。
GetKai … 解答を返す。
Private Function GetKai(pt As Long, txt As String) As String '--=*=----=*=----=*=----=*=----=*=-- '解答を返す。 ' 引数:pt(Long型) … 検索開始位置 ' txt(String型) … 被検索文字列 ' 返却値:String型 … 解答 '--=*=----=*=----=*=----=*=----=*=-- Dim cnt As Integer, ch As String, ss As String ss = "" If pt = 0 Then GetKai = ss Exit Function End If cnt = 1 ch = Mid(txt, pt - cnt, 1) Do Until ch = Right(KAKKO2, 1) 'KAKKO2="[]" ss = ch & ss cnt = cnt + 1 ch = Mid(txt, pt - cnt, 1) Loop GetKai = Trim(ss) End Function
各解答末尾の半角のアの位置(引数pt)から問番号([n])の"]"までの文字列を返却する。
Text2HTML … テキストをHTML化
Public Function Text2HTML(ByVal ptext As String) As String '--=*=----=*=----=*=----=*=----=*=-- 'テキストをHTML化 ' 引数:ptext(String型) … テキストデータ(問題) ' 返却値:String型 … HTMLタグが挿入されたデータ ' ' 問題と解答の境界に "#--" 、解答の終わりに "##" をデータとして入れておく。 ' 画像ファイル名は "IMG=filename" の形式とする。filenameは""ではさまない。 '--=*=----=*=----=*=----=*=----=*=-- Dim sdat As String, smon As String Dim pt As Long If ptext = "" Then Text2HTML = "" Exit Function End If pt = InStr(App.Title, "作成ツール") sdat = sHTML(1) sdat = sdat & "<TITLE>" & Left(App.Title, pt - 1) & "</TITLE>" & vbCrLf sdat = sdat & sHTML(2) & "<P>" smon = Text2Text(ptext) pt = InStr(smon, vbCrLf) '<BR> 改行位置 Do Until pt = 0 smon = Left(smon, pt - 1) & "<BR>" & Mid(smon, pt) pt = InStr(pt + 5, smon, vbCrLf) Loop pt = InStr(smon, "#--") '<P> 解答開始位置 Do Until pt = 0 smon = Left(smon, pt - 1) & "</P>" & vbCrLf & "<P>" & Mid(smon, pt) pt = InStr(pt + 12, smon, "#--") Loop pt = InStr(smon, "##") '<P> 問題終わり位置 Do Until pt = 0 smon = Left(smon, pt - 1) & "</P>" & vbCrLf & Mid(smon, pt) pt = InStr(pt + 8, smon, "##") Loop pt = InStr(smon, " ") ' 半角空白を変換 Do Until pt = 0 smon = Left(smon, pt - 1) & " " & Mid(smon, pt + 1) pt = InStr(pt + 6, smon, " ") Loop pt = InStr(smon, "IMG=") '<IMG> 画像参照 Do Until pt = 0 smon = Left(smon, pt - 1) & "<IMG src=" & DQ & Mid(smon, pt + 4, 10) & _ DQ & " border=" & DQ & "0" & DQ & ">" & Mid(smon, pt + 14) pt = InStr(pt, smon, "IMG=") Loop sdat = sdat & smon sdat = sdat & sHTML(3) Text2HTML = sdat '返却値 End Function
問題と解答のデータにHTML(表示)用のタグを挿入する処理である。
挿入するタグは、配列sHTMLの(1)(2)(3)と改行(<BR>)、問題と解答をそれぞれ1つの段落にするための<P>〜</P>、半角空白を に変換、画像参照の<IMG>である。
Text2Text … テキスト化
Public Function Text2Text(ByVal ptext As String) As String '--=*=----=*=----=*=----=*=----=*=-- 'テキスト化 ' 引数:ptext(String型) … テキストデータ(問題) ' 返却値:String型 … "ア"と"イ"を空白に変換したデータ '--=*=----=*=----=*=----=*=----=*=-- Dim pt As Long, smon As String 'Text2Text = ptext: Exit Function 'for Test smon = ptext pt = InStr(smon, "ア") 'ア Do Until pt = 0 smon = Left(smon, pt - 1) & " " & Mid(smon, pt + 1) pt = InStr(pt + 1, smon, "ア") Loop pt = InStr(smon, "イ") 'イ Do Until pt = 0 smon = Left(smon, pt - 1) & Mid(smon, pt + 1) pt = InStr(pt + 1, smon, "イ") Loop Text2Text = smon End Function
半角のアとイを半角空白に変換する処理である。
ReadHTML … HTMLデータ読み込み
Public Sub ReadHTML()
'--=*=----=*=----=*=----=*=----=*=--
'HTMLデータ読み込み
' 引数:なし
' 返却値:なし
' グローバル変数sHTML()に読み込む
' sHTML(1)=先頭
' sHTML(0)=JAVAScript
' sHTML(2)=中間
' sHTML(3)=最後
'--=*=----=*=----=*=----=*=----=*=--
Dim key(3) As String, n As Integer
Dim sd As String
key(0) = "[SCRIPT]"
key(1) = "[HTML01]"
key(2) = "[HTML02]"
key(3) = "[HTML03]"
On Error GoTo ErrFile
For n = 0 To 3
sHTML(n) = iniFileRead(aFolder & "\DrillSub.ini", key(n))
Next n
Exit Sub
ErrFile:
MsgBox "初期化データファイルがありません。", vbOKOnly, App.Title
End
End Sub
HTMLタグはDrillSub.iniファイルに用意して、このファイルから配列sHTMLに読み込んでいる。読み込みにはiniFileReadプロシージャを使う。
プログラムリストのファイル名に"\"(バックスラッシュ)があるが、これは"\"記号のことである。
sHTML(n) = iniFileRead(aFolder & "\DrillSub.ini", key(n))
iniFileRead … iniファイルの読み込み
Public Function iniFileRead(fname As String, keyw As String) As String '--=*=----=*=----=*=----=*=----=*=-- 'iniファイルの読み込み ' 引数:fname(String型) … *.iniファイル ' keyw(String型) … キーワード ' 返却値:データ(String型) '--=*=----=*=----=*=----=*=----=*=-- Dim sd As String, buff As String On Error GoTo ErrFile buff = "" Open fname For Input As #1 Do If EOF(1) Then iniFileRead = "" Exit Do End If Line Input #1, sd If sd = keyw Then Exit Do End If Loop Do If EOF(1) Then Exit Do End If Line Input #1, sd If Left(sd, 1) = "[" Or Len(sd) = 0 Then Exit Do End If buff = buff & sd & vbCrLf Loop Close #1 iniFileRead = Trim(buff) Exit Function ErrFile: '*.iniファイルなし iniFileRead = "" End Function
ファイル(引数fname)からキーワードのデータを読み込む処理である。
キーワードは"[ ]"ではさまれている。キーワードの次の行から次のキーワードまたは空行までをデータとして返却する。
iniFileWrite … iniファイルへの書き込み
Public Sub iniFileWrite(fname As String, keyw As String, dat As String) '--=*=----=*=----=*=----=*=----=*=-- 'iniファイルへの書き込み ' 引数:fname(String型) … *.iniファイル ' keyw(String型) … キーワード ' dat(String型) … データ ' 返却値:なし '--=*=----=*=----=*=----=*=----=*=-- Dim sd As String, buff As String Dim flag As Boolean On Error GoTo ErrFile buff = "" flag = True Open fname For Input As #1 Do Until EOF(1) Line Input #1, sd If sd = keyw Then flag = False ElseIf Left(sd, 1) = "[" Or Len(sd) = 0 Then flag = True End If If flag Then buff = buff & sd & vbCrLf End If Loop Close #1 Open fname For Output As #1 Print #1, buff; Print #1, keyw Print #1, dat Close #1 Exit Sub ErrFile: '*.iniファイルなし、新規作成 Open fname For Output As #1 Print #1, keyw Print #1, dat Close #1 End Sub
ファイル(引数fname)にキーワードのデータを書き込む処理である。
同じキーワードがあれば、それを削除して書き込む。また、書き込むファイルが存在しないときはファイルを新規に作成する。
BaseName … ファイル名の取得
Public Function BaseName(ByVal fname As String) As String
'--=*=----=*=----=*=----=*=----=*=--
'ファイル名の取得
' 引数:fname(String型)…ファイル名
' 返却値:String型 …ファイル名の拡張子を除いた部分
'--=*=----=*=----=*=----=*=----=*=--
Dim pt As Integer, base As String
base = ""
pt = InStr(fname, ".")
Do Until pt = 0
base = Left(fname, pt)
fname = Mid(fname, pt + 1)
pt = InStr(fname, ".")
Loop
BaseName = Left(base, Len(base) - 1)
End Function
ファイル名(filename.ext)から拡張子部分(.ext)を除いたファイル名(filename)だけを返却する処理である。
PathName … バス名の取得
Public Function PathName(ByVal fname As String) As String
'--=*=----=*=----=*=----=*=----=*=--
'バス名の取得
' 引数:fname(String型)…ファイル名
' 返却値:String型 …ファイル名を除いたPath部分
'--=*=----=*=----=*=----=*=----=*=--
Dim pt As Integer, wk As String
wk = ""
pt = InStr(fname, "\")
Do Until pt = 0
wk = wk & Left(fname, pt)
fname = Mid(fname, pt + 1)
pt = InStr(fname, "\")
Loop
PathName = wk
End Function
パス名(d:\folder\filename.ext)からファイル名(filename.ext)を除いたパス名(d:\folder\)だけを返却する処理である。
プログラムリストのファイル名に"\"(バックスラッシュ)があるが、これは"\"記号のことである。
isFile … ファイルの存在の有無を返す
Public Function isFile(fname As String) As Boolean
'--=*=----=*=----=*=----=*=----=*=--
'ファイルの存在の有無を返す
' 引数:fname(String型)…ファイル名
' 返却値:Boolean型 …True=ファイルあり、False=ファイルなし
'--=*=----=*=----=*=----=*=----=*=--
On Error GoTo Err1
Open fname For Input As #1
Close #1
isFile = True
Exit Function
Err1:
isFile = False
End Function
InitRansuu … 同じ乱数系列のための初期化
Public Sub InitRansuu(nn As Long)
'--=*=----=*=----=*=----=*=----=*=--
'同じ乱数系列のための初期化
' 引数:nn(Long型)…乱数系列の初期値
' 返却値:なし
'Randomizeの引数に同じ値を指定しても同じ乱数は発生しない。
'同じ乱数系列を発生するにはRandomizeの直前で負数を引数にしてRndを実行する。(ヘルプより)
'--=*=----=*=----=*=----=*=----=*=--
Rnd -1
Randomize nn
End Sub
Ransuu … 指定範囲の整数の乱数を返却する。
Public Function Ransuu(min As Long, max As Long) As Long
'--=*=----=*=----=*=----=*=----=*=--
'指定範囲の整数の乱数を返却する。
' 引数:min(Long型)…指定範囲の下限値
' :max(Long型)…指定範囲の上限値
' 返却値:Long型 …指定範囲の乱数
'--=*=----=*=----=*=----=*=----=*=--
Ransuu = Int((max - min + 1) * Rnd + min)
End Function
RansuuN … 指定範囲の整数の乱数を複数個作成する。
Public Sub RansuuN(ko As Integer, arry() As Double, min As Long, max As Long)
'--=*=----=*=----=*=----=*=----=*=--
'指定範囲の整数の乱数を複数個作成する。
' 引数:ko(Integer型)…乱数を作成する個数
' :arry()(Double型配列)…乱数記憶用の配列。呼出し側で必要個数宣言する。
' :min(Long型)…指定範囲の下限値
' :max(Long型)…指定範囲の上限値
' 返却値:なし …引数の配列arry()に乱数値を記憶する。同じ乱数値はない。
'--=*=----=*=----=*=----=*=----=*=--
Dim n As Integer, n1 As Integer
If max - min + 1 < ko Then
MsgBox "乱数を作成することができません。", vbOKOnly, App.Title
Exit Sub
End If
For n = 1 To ko
arry(n) = 0
Do
arry(n) = Int((max - min + 1) * Rnd + min)
For n1 = 0 To n - 1
If arry(n) = arry(n1) Then
arry(n) = 0
Exit For
End If
Next n1
Loop While arry(n) = 0
Next n
End Sub
Dec2Hex … 10→16進数文字列変換
Public Function Dec2Hex(ByVal dat As Double) As String '--=*=----=*=----=*=----=*=----=*=-- '10->16進数文字列変換 ' 引数:dat(Double型)…変換したいデータ ' 返却値:String型 …16進数文字列 '--=*=----=*=----=*=----=*=----=*=-- Dim fDat As Double, wk As Integer Dim iAns As String, fAns As String Dim n As Integer If dat < 0 Then '負数は除外 Dec2Hex = "" Exit Function End If iAns = Hex(Int(dat)) '整数部 fAns = "" fDat = dat - Int(dat) '小数部 '小数部の処理 If fDat <> 0 Then For n = 1 To 8 '小数8けたまで wk = Int(fDat * 16) If wk <> 0 Then fAns = fAns & Hex(wk) Else fAns = fAns & "0" End If fDat = fDat * 16 - wk If fDat = 0 Then Exit For Next n Dec2Hex = iAns & "." & fAns Else Dec2Hex = iAns End If End Function
Hex2Dec … 16→10進数文字列変換
Public Function Hex2Dec(ByVal dat As String) As Double '--=*=----=*=----=*=----=*=----=*=-- '16->10進数文字列変換 ' 引数:dat(String型)…変換したいデータ ' 返却値:Double型 …10進数値 '--=*=----=*=----=*=----=*=----=*=-- Dim iDat As String, fDat As String, ch As String Dim iAns As Double, fAns As Double Dim n As Integer If Left(dat, 1) = "-" Then '負数は除外 Hex2Dec = "" Exit Function End If n = InStr(dat, ".") If n = 0 Then '小数部なし iDat = dat '整数部 fDat = "" '小数部 Else iDat = Left(dat, n - 1) '整数部 fDat = Mid(dat, n + 1) '小数部 End If iAns = Val("&h" & iDat) '整数部 fAns = 0 '小数部の処理 For n = 1 To Len(fDat) ch = Left(fDat, 1) If ch <> "0" Then fAns = fAns + Val("&h" & ch) / 16 ^ n End If fDat = Mid(fDat, 2) Next n Hex2Dec = iAns + fAns End Function
Dec2Bin … 10→2進数文字列変換
Public Function Dec2Bin(ByVal dat As Double) As String '--=*=----=*=----=*=----=*=----=*=-- '10->2進数文字列変換 ' 引数:dat(Double型)…変換したいデータ ' 返却値:String型 …2進数文字列 '--=*=----=*=----=*=----=*=----=*=-- Dim iDat As Double, fDat As Double Dim iAns As String, fAns As String Dim n As Integer If dat < 0 Then '負数は除外 Dec2Bin = "" Exit Function End If iAns = "" fAns = "" iDat = Int(dat) '整数部 fDat = dat - iDat '小数部 '整数部の処理 Do If iDat Mod 2 = 1 Then iAns = "1" & iAns Else iAns = "0" & iAns End If iDat = Int(iDat / 2) Loop Until iDat = 0 '小数部の処理 If fDat <> 0 Then For n = 1 To 8 '小数8けたまで If Int(fDat * 2) = 1 Then fAns = fAns & "1" Else fAns = fAns & "0" End If fDat = fDat * 2 - Int(fDat * 2) If fDat = 0 Then Exit For Next n Dec2Bin = iAns & "." & fAns Else Dec2Bin = iAns End If End Function
Bin2Dec … 2→10進数文字列変換
Public Function Bin2Dec(ByVal dat As String) As Double '--=*=----=*=----=*=----=*=----=*=-- '2->10進数文字列変換 ' 引数:dat(String型)…変換したいデータ ' 返却値:Double型 …10進数値 '--=*=----=*=----=*=----=*=----=*=-- Dim iDat As String, fDat As String Dim iAns As Double, fAns As Double Dim n As Integer If Left(dat, 1) = "-" Then '負数は除外 Bin2Dec = "" Exit Function End If n = InStr(dat, ".") If n = 0 Then '小数部なし iDat = dat '整数部 fDat = "" '小数部 Else iDat = Left(dat, n - 1) '整数部 fDat = Mid(dat, n + 1) '小数部 End If iAns = 0 fAns = 0 '整数部の処理 For n = 1 To Len(iDat) If Left(iDat, 1) = "1" Then iAns = iAns * 2 + 1 Else iAns = iAns * 2 End If iDat = Mid(iDat, 2) Next n '小数部の処理 For n = 1 To Len(fDat) If Left(fDat, 1) = "1" Then fAns = fAns + 1 / 2 ^ n End If fDat = Mid(fDat, 2) Next n Bin2Dec = iAns + fAns End Function
Copyright © 2003 Hiroshi Masuda |