ドリル作成ツール 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(表示)用のタグを挿入する処理である。

Top

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])の"]"までの長さをカウントしている。

Top

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])の"]"までの文字列を返却する。

Top

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, " ")   '&nbsp; 半角空白を変換
    Do Until pt = 0
        smon = Left(smon, pt - 1) & "&nbsp;" & 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>、半角空白を&nbsp;に変換、画像参照の<IMG>である。

Top

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

 半角のアとイを半角空白に変換する処理である。

Top

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))

Top

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)からキーワードのデータを読み込む処理である。
 キーワードは"[ ]"ではさまれている。キーワードの次の行から次のキーワードまたは空行までをデータとして返却する。

Top

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)にキーワードのデータを書き込む処理である。
 同じキーワードがあれば、それを削除して書き込む。また、書き込むファイルが存在しないときはファイルを新規に作成する。

Top

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)だけを返却する処理である。

Top

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\)だけを返却する処理である。
 プログラムリストのファイル名に"\"(バックスラッシュ)があるが、これは"\"記号のことである。

Top

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

Top

InitRansuu … 同じ乱数系列のための初期化

Public Sub InitRansuu(nn As Long)
'--=*=----=*=----=*=----=*=----=*=--
'同じ乱数系列のための初期化
' 引数:nn(Long型)…乱数系列の初期値
' 返却値:なし
    'Randomizeの引数に同じ値を指定しても同じ乱数は発生しない。
    '同じ乱数系列を発生するにはRandomizeの直前で負数を引数にしてRndを実行する。(ヘルプより)
'--=*=----=*=----=*=----=*=----=*=--
    Rnd -1
    Randomize nn
End Sub

Top

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

Top

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

Top

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

Top

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

Top

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

Top

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

Top


前へ 目次へ 次へ 
Copyright © 2003 Hiroshi Masuda 

 

 

inserted by FC2 system