漢字変換プログラムについて

タグの編集
投稿者 ボーヤ  (社会人) 投稿日時 2009/3/3 09:55:33
今日からVBを学び始めた超初心者です。。。
テキストボックス一つ、コマンドボタン一つ、ラベルコントロール一つを
セットして数字から漢数字に変換するプログラムを作りたいのですが、
全く歯が立ちません…
ご助言をお願いします。
バージョンは6.0です。
投稿者 ヴァン  (社会人) 投稿日時 2009/3/3 18:59:33
こんにちは。

VB6は良く分かっていませんが、単純にこんなのじゃだめですかね。

Select Case textBox1.Text
Case '0': label1.Text = "一"
Case '1': label1.Text = "二"
投稿者 るきお  (社会人) 投稿日時 2009/3/3 21:23:34
既にヴァンさんが書かれたものを、VB6に合わせて書くとこんなかんじです。

Private Sub Command1_Click()

    Select Case Text1.Text
        Case "1"
            Label1.Caption = "一"
        Case "2"
            Label1.Caption = "二"
        '以下省略 
    End Select

End Sub


しかし、今日からVBを始めたのに10年前のバージョンを使用されるとは何か事情があるのでしょうか?
せっかく新しく始められるのでしたら最新版のVB2008をお奨めします。
無料でダウンロードして使用できます。
http://www.microsoft.com/japan/msdn/vstudio/express/
投稿者 ボーヤ  (社会人) 投稿日時 2009/3/4 06:51:42
ヴァンさん、るきおさん

丁寧なご説明有難う御座います!!
お陰様で、Select Caseを初体験出来ました。

転職して会社の研修中(主に自習)なんですが、何でもVB6の方が機能が充実していないので、初心者を鍛える
のに向いてるらしいそうだからです。。。
研修に入る前からこちらのサイトでお世話になっていたのですが、本当に全くの素人でもわかり
やすいので、これからも活用させていただきます!!


質問ばかりで、申し訳御座いませんが、もう少し教えて頂きたい個所があります。
教えていただいた機能に加えてなんですが、

・5桁の数字を入力するには
 ex「65432」を変換して「六五四三二」へ
・桁数を表す漢字を入力するには
  ex「65432」→「六万五千四百三十二」へ

今日一日、格闘したのですが、進歩がありませんでした…
質問ばかり申し訳御座いません。
投稿者 neptune  (社会人) 投稿日時 2009/3/4 08:19:01
こんにちは

数字から漢数字はselect文を使うとして、文字列の分解の問題で躓いているんですか?
>・5桁の数字を入力するには
> ex「65432」を変換して「六五四三二」へ
サンプル

Sub t()
Dim sbuf As String
Dim iLen As Long
Dim i As Long

    sbuf = "123456"
    iLen = Len(sbuf)
    For i = 1 To iLen
        Debug.Print Mid(sbuf, i, 1)
    Next i
End Sub


>・桁数を表す漢字を入力するには
>  ex「65432」→「六万五千四百三十二」へ
に付いては、例えば10000で割り算した結果が1以上の整数があれば1万の桁があるのがわかりますね。
65432 - 65432割る(\か¥)10000
で6を割り出し→六万
65432 - 6 * 10000 = 5432
5432に対して同じ計算を繰り返す。

それとも、本当に例のような数値であれば桁数をlenで数えても判りますね。
投稿者 ボーヤ  (社会人) 投稿日時 2009/3/4 10:35:32
neptuneさん

どうも有難う御座いますm(__)m

教えていただいた通り5桁数字入力を実行してみたのですが、「実行時エラー"5" プロシージャの呼び出し、または引数が不正です」と出てしまいました…
無知な自分の書き方がいけないのですが、どこが悪いのかもわからない状態です。

桁数を表す漢字も入れる方は、すみませんが自分のレベルではちんぷんかんぷんです。。。
せっかく答えていただきましたのに、理解出来ず、自分が情けないです…


質問の仕方が悪かったと反省しています。
問題をそっくりそのまま書きますと、(以下抜粋)

①Text1に五桁までの数字を入力します。数字を入力した後で、”変換”と書かれたコマンドボタン
 をクリックしたならば、Text1を漢数字に変換し、ラベルコントロールへ表示して下さい。

②①が出来たならば、”変換”ボタンの下にもう一つのコマンドボタンを配置し、Captionに”変換2”を
 セットして下さい。Text1に五桁の数字をセットするところまでは同じです。”変換2”ボタンがクリ
 ックされたならば、桁数を表す漢字も入れて変換して下さい。


前回初めて挑んだ課題が四則演算プログラムでした。
それが出来たばかりの超初心者です…

度々質問ばかりで本当にすいません。
投稿者 るきお  (社会人) 投稿日時 2009/3/4 21:25:02
勉強目的とのことですが
ボーヤさんの代わりにこの掲示板を見た誰かが作ってしまってもよいのでしょうか?
投稿者 ヴァン  (社会人) 投稿日時 2009/3/4 21:44:08
>何でもVB6の方が機能が充実していないので、初心者を鍛えるのに向いてるらしいそうだからです。。。
これからもVB6の開発でもしない限りは無駄なだけに思えますが...

> ex「65432」→「六万五千四百三十二」へ
これは「億」や「兆」とかも考える必要があるんですよね。

「万」「億」「兆」で区切って考えた方が良いですかね。
そうすればその中で千の位、百の位、十の位、一の位と考えられます。

投稿者 ボーヤ  (社会人) 投稿日時 2009/3/5 04:51:26
皆さん

お世話になってます。

勉強なので、出来る方達に聞いてしまっては元も子もないのですが…
出来れば宜しくお願い致しますm(__)m

桁数を表す問題の方ですが、五桁(万の位)までで平気だと思います。
本日も色々研修でいじくったのですが、変換しなくなってしまったりとか。。。
投稿者 (削除されました)  () 投稿日時 2009/3/5 05:49:36
(削除されました)
投稿者 neptune  (社会人) 投稿日時 2009/3/5 05:53:43
こんにちは

今、どんなコード書いているかUPした方が良いですよ。
ボーヤさんの書き込み最近の2つ見ただけでは何がわからんのか、何がわかっているのか
が判らんです。
明確になれば、皆さんからアドバイスは頂けます。

2番目の問題は、ただプログラミングを書く事よりロジックを考える為の問題でしょうから。

考え方は私が書いた考え方とヴァンさんのアドバイスを組み合わせれば出来ます。
先ず、それを考える事が先決ですね。
↑が重要なんですから。
ここを考える事を放棄して、他人に考えてもらったら何にもしないのと同じです。
ここはどんな言語かは関係ないです。

ここを悩む所が問題出した人の狙いなんですから。

>出来れば宜しくお願い致しますm(__)m
これじゃおかしいでしょ。後で自分が困りますよ。
投稿者 ボーヤ  (社会人) 投稿日時 2009/3/5 07:57:59
neptuneさん
こんばんわ

ご指摘の通りです…
何をどのように活用すればよいか、わからず皆さんのご好意に
甘えてしまいました。基礎の基礎もあやふやなのに気ばかり焦ってしまって…すみません。。。

以下がコードです。皆さんから教えていただいた物と無い頭を使って自分なりに書いたものです。


cmdhenkanが”変換”コマンドボタンで、
cmdketaが”変換2”コマンドボタンです。

Option Explicit
Private Sub cmdhenkan_Click()
    Dim Suzi: Dim Kansuzi As String
    
    Suzi = txtsuzi
    Kansuzi = lblkansuzi
    
    Select Case txtsuzi.Text
    
    Case "0"
        lblkansuzi.Caption = "〇"
    Case "1"
        lblkansuzi.Caption = "一"
    Case "2"
        lblkansuzi.Caption = "二"
    Case "3"
        lblkansuzi.Caption = "三"
    Case "4"
        lblkansuzi.Caption = "四"
    Case "5"
        lblkansuzi.Caption = "五"
    Case "6"
        lblkansuzi.Caption = "六"
    Case "7"
        lblkansuzi.Caption = "七"
    Case "8"
        lblkansuzi.Caption = "八"
    Case "9"
        lblkansuzi.Caption = "九"
        
    End Select
    
End Sub

Private Sub cmdketa_Click()
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim e As Integer

lblkansuzi = a
lblkansuzi = b
lblkansuzi = c
lblkansuzi = d
lblkansuzi = e


a = len(&"万") * 10000
b = len(&"千") * 1000
c = len(&"百") * 100
d = len(&"十") * 10
e = len()*1




End Sub

Private Sub lblkansuzi_Click()
    Dim txtsuzi: Dim lblkansuzi As String
    Dim i As Long

    txtsuzi = "00000"
    iLen = Len(textsuzi)
    For i = 1 To iLen
        lblkansuzi.Print Mid(txtsuzi, i, 1)
    Next i


End Sub

neptuneさんのご指摘通り、きちんと勉強していきたいので、
答えではなく、考え方のヒントなどを宜しくお願いします。

絶対に作れるようにしてみせます!

投稿者 Nightmare  (社会人) 投稿日時 2009/3/5 21:02:05
レス失礼します。

きちんと見ていない&やっていないので間違っていましたらすいません(汗)
and ご指摘がありましたらどんどんお願いします。
(1)変換1が動いているのか
 これを見る&自分のでやってみたんですが動かなかったです(汗)
 テキストボックスに入っている数字をコマンドボタン(変換)を押すことで
 ラベルに表示されるんですよね?(解釈がおかしかったらご指摘ください) 

 cmdhenkan クリックにて
 
 lblkansuzi がラベルですよね?
  txtsuzi がテキストボックスですよね?

> Kansuzi = lblkansuzi

 では、Kansuzi は何に使われていますか?
 Kansuzi に入れているのでしたら、

    Case "0"
        Kansuzi = "〇"

 にする方がいいです。
 また、
    
  Case "0"
        Kansuzi = "〇"

 では塗り替えをしてしまいます(たぶん)
 もし "123" だと "三" となってしまいます。
 また case文(試せなかったので動くかも(汗))だと、
 2ケタ以上だと引っかからない可能性があります。
 そういうことがあるので、if文+like でやるといいと思います。
  
  '例.	 
Dim Number as string
Dim Anumber as Long
Dim Kansuzi as string

Anumber = txtsuzi.text

If Anumber Like "*1*" Then
            Number = "一"
  Kansuzi = Kansuzi + Number
        End If

lblkansuzi = Kansuzi
  

 
(2)エラー
  これを見るとエラーがおきた時どうするか書かれていません。
  もし変換するものに数字以外が入った場合や、
  何も入れずに変換ボタンを押した場合にどうするかです。
  (書かれていましたらスルーしてください。)
  私の場合、エラーを出した場合は Msgbox をだして警告、
    そして txtsuzi を 初期化 + SetFocus をします。

(3)テキストボックス
    テキストボックスって1つでしょうか?
  cmdhenkan_Click にて
> Suzi = txtsuzi
         ~~~~~~~
  lblkansuzi_Click にて
> iLen = Len(textsuzi)
                   ~~~~~~~~~
    と書かれてたので2つあるのかな?

(1)は自信がないのでスルーしても構いません(汗)
(2)も気にはなったものですから…
   あまり題材とは関係がないかも知れませんね(汗)

とりあえず1部分気になったものだけ見てみました。まだきちんとみていないので
わかりませんが、他の皆様方のすばらしいレスで出来ると思います。頑張って作って
みてください。

また neptuneさん、るきおさん、ボーヤさんが言われている通り、勉強目的なのに
ヒントではなく答え言ったかもしれません。その場合はすいません。
投稿者 ボーヤ  (社会人) 投稿日時 2009/3/6 06:18:42
Nightmareさん

アドバイス有難う御座います。
エラー…
そこまで考える余裕がなかったです。

今日は、落ち着いてフローチャートを書く事から始めました。
こういう結果を出したかったら、どうすればいいのか落ち着いて
考え、まだまだですが、わからない事がわからないというトンネルから
抜け出したような感じがします。


今日現在まで色々調べたりして、以下のようにまできました。




Option Explicit
Private Sub cmdhenkan_Click()
    
    lblkansuzi.Caption = NumKanji(txtsuzi.Text)

End Sub
Private Function NumKanji(ByVal Arg As String) As String
    Dim Idx As Long
    For Idx = 1& To 10&
        Arg = Replace$(Arg, _
            Mid$("1234567890", Idx, 1&), _
            Mid$("一二三四五六七八九〇", Idx, 1&) _
        )
    Next
    
    NumKanji = Arg

End Function
Private Sub txtsuzi_KeyPress(KeyAscii As Integer)
    Dim Key As String
    
    Key = Chr(KeyAscii)
    
    If Key >= "0" And Key <= "9" Then

    ElseIf Key = Chr(8) Then

    Else
    KeyAscii = 0
    MsgBox "数値以外は入力できません。", vbOKOnly + vbInformation, "情報"
    
    End If


    
    If Len(txtsuzi.Text) >= 5 And _
    ((KeyAscii >= Asc("A") And KeyAscii <= Asc("z")) _
    Or (KeyAscii >= Asc("0") And KeyAscii <= Asc("9"))) Then
    
    MsgBox "桁数は5桁までです。", vbOKOnly + vbInformation, "情報"
    KeyAscii = 0
    End If



次は、12345の五桁数字を一万二千三百四十五と変換出来るように頑張ります。
投稿者 (削除されました)  () 投稿日時 2009/3/6 06:21:00
(削除されました)
投稿者 neptune  (社会人) 投稿日時 2009/3/6 07:25:48
こんにちは

↑ボーヤさんの書かれた事を言葉で書いた内容でしたので削除しました。
置換部分は最初の路線のselect caseでしたけど。

まるで別人のようなソースですね。もしかして、別言語で経験アリとか。

後は自前で考えるか、ヴァンさんが書かれているのを参考にするとかで、
出来ますね。

前回のソースは突っ込みどころ満載でしたけど、ほんとに自分で書いたんですか???
それならびっくり。初心者の書くソースじゃない。たいしたもんだ。


ソースをUPする際は
上にある「投稿で使用できる特殊コードの説明」を読んで
コード用のタグを付けて下さい。読みやすくなります。