Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11152 / 13644 ツリー ←次へ | 前へ→

【17788】分数の表示は? ponpon 04/9/7(火) 18:34 質問[未読]
【17796】Re:分数の表示は? ichinose 04/9/7(火) 23:55 回答[未読]
【17798】Re:分数の表示は? 訂正 ichinose 04/9/8(水) 0:23 発言[未読]
【17844】Re:分数の表示は? ponpon 04/9/8(水) 18:35 お礼[未読]
【17852】Re:分数の表示は? ichinose 04/9/8(水) 19:36 発言[未読]
【17854】Re:分数の表示は? 訂正の訂正 ichinose 04/9/8(水) 20:04 発言[未読]
【17855】Re:分数の表示は? ponpon 04/9/8(水) 20:26 発言[未読]
【17797】Re:分数の表示は? ちゃっぴ 04/9/7(火) 23:58 回答[未読]
【17845】Re:分数の表示は? ponpon 04/9/8(水) 18:52 お礼[未読]
【17799】Re:分数の表示は? ponpon 04/9/8(水) 0:31 発言[未読]

【17788】分数の表示は?
質問  ponpon  - 04/9/7(火) 18:34 -

引用なし
パスワード
    最近ときどきお世話になってます。初心者です。台風も無事通り過ぎましたので・・・
 分数で検索しましたがヒットしませんでしたので、質問させてください。
 乱数(関数)を使って子ども用に下のような問題を作っています。
 しかし、約分ができる分数ができてしまいます。今は、if関数を使いこの分母の時は
分子はいくらと決めて表示をしています。したがって同じような分数がたくさんできてしまいます。
 そこで、VBAを使ってできないものかと考えていますがうまくいきません。
 loopを使ってやればできそうなのですが、・・・
 ちなみに分母は 30までで 仮分数はだめです。子ども向けなので2/5のような表示もだめです。よろしくお願いします。

 A B C D E F
1  1   3
2  - × - =
3  3   4
4
5  3   2
6  - + - = 
7  7   5
8

【17796】Re:分数の表示は?
回答  ichinose  - 04/9/7(火) 23:55 -

引用なし
パスワード
   ▼ponpon さん:
こんばんは。

> 最近ときどきお世話になってます。初心者です。台風も無事通り過ぎましたので・・・
> 分数で検索しましたがヒットしませんでしたので、質問させてください。
> 乱数(関数)を使って子ども用に下のような問題を作っています。
> しかし、約分ができる分数ができてしまいます。今は、if関数を使いこの分母の時は
>分子はいくらと決めて表示をしています。したがって同じような分数がたくさんできてしまいます。
> そこで、VBAを使ってできないものかと考えていますがうまくいきません。
> loopを使ってやればできそうなのですが、・・・
> ちなみに分母は 30までで 仮分数はだめです。子ども向けなので2/5のような表示もだめです。よろしくお願いします。
>
> A B C D E F
>1  1   3
>2  - × - =
>3  3   4
>4
>5  3   2
>6  - + - = 
>7  7   5
>8
新規ブックに以下のコードをコピーして実行してみて下さい。
'===============================================================
Sub main()
  Dim Mol(0 To 1) As Long, Deno(0 To 1) As Long
  Randomize Timer
  For idx = 1 To 30 Step 3
   For jdx = 0 To 1
    Call get_Fract(Mol(jdx), Deno(jdx), 30) '分数の分子・分母の取得
    Next jdx
   Call set_計算式(Cells(idx, 1), Mol(), Deno(), _
       Choose(Int(Rnd * 4) + 1, "+", "−", "×", "÷")) '計算式の表示
   Next
End Sub
'===============================================================
Sub get_Fract(分子 As Long, 分母 As Long, 分母lim As Long)
'乱数値から、分数の分子・分母を作成する
'input : 分母lim---分母のリミット値(この値以下の分母を返す)
'output: 分子、分母
  Dim r As Double
  Do
   r = Rnd
   If r > 0 Then
    wk = Split(WorksheetFunction.Text(r, "??/??"), "/")
    If wk(0) > 0 And wk(0) < wk(1) And wk(1) <= 分母lim Then
      分子 = wk(0)
      分母 = wk(1)
      Exit Do
      End If
    End If
   Loop
  Erase wk
End Sub
'===============================================================
Sub set_計算式(rng As Range, 分子() As Long, 分母() As Long, 演算子 As String)
'指定されたセル位置を開始位置としてふたつの分数計算式を表示する
'input : rng---表示開始セル
'     分子()----ふたつの分数値の分子を格納した配列(引数は、0から始まる)
'     分母()----ふたつの分数値の分母を格納した配列(引数は、0から始まる)
'     演算子----演算子文字列を格納
  For idx = 0 To 1
   With rng.Offset(0, idx * 2)
    With .Borders(xlEdgeBottom)
      .LineStyle = xlContinuous
      .Weight = xlThin
      .ColorIndex = xlAutomatic
      End With
    .Value = 分子(idx)
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlBottom
    End With
   With rng.Offset(1, idx * 2)
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlTop
    .Value = 分母(idx)
    End With
   Next idx
  With rng.Offset(0, 1).Resize(2, 1)
   .HorizontalAlignment = xlCenter
   .VerticalAlignment = xlCenter
   .MergeCells = True
   .Value = 演算子
   End With
  With rng.Offset(0, 3).Resize(2, 1)
   .HorizontalAlignment = xlCenter
   .VerticalAlignment = xlCenter
   .MergeCells = True
   .Value = "="
   End With
End Sub

プロシジャーmainを実行してみて下さい。
アクティブシートのセルA1から計算式を10行表示するはずです。

列幅や行の幅は、適当に調節して下さい。
又、mainプロシジャーを変更すれば、
計算式の開始位置や計算式の作成数の増減も可能です。

まずは、確認してみて下さい。

【17797】Re:分数の表示は?
回答  ちゃっぴ  - 04/9/7(火) 23:58 -

引用なし
パスワード
   こんな感じでいかが?

Sub Test()
  Dim a As Integer
  Dim b As Integer
  
  a = Int((29 * Rnd) + 2)
  Do
    b = Int(((a - 1) * Rnd) + 1)
  Loop Until b Mod a > 0
  
  MsgBox b & "/" & a
End Sub

【17798】Re:分数の表示は? 訂正
発言  ichinose  - 04/9/8(水) 0:23 -

引用なし
パスワード
   一箇所訂正して下さい。
>▼ponpon さん:
>こんばんは。
>
>> 最近ときどきお世話になってます。初心者です。台風も無事通り過ぎましたので・・・
>> 分数で検索しましたがヒットしませんでしたので、質問させてください。
>> 乱数(関数)を使って子ども用に下のような問題を作っています。
>> しかし、約分ができる分数ができてしまいます。今は、if関数を使いこの分母の時は
>>分子はいくらと決めて表示をしています。したがって同じような分数がたくさんできてしまいます。
>> そこで、VBAを使ってできないものかと考えていますがうまくいきません。
>> loopを使ってやればできそうなのですが、・・・
>> ちなみに分母は 30までで 仮分数はだめです。子ども向けなので2/5のような表示もだめです。よろしくお願いします。
>>
>> A B C D E F
>>1  1   3
>>2  - × - =
>>3  3   4
>>4
>>5  3   2
>>6  - + - = 
>>7  7   5
>>8
>新規ブックに以下のコードをコピーして実行してみて下さい。
>'===============================================================
>Sub main()
>  Dim Mol(0 To 1) As Long, Deno(0 To 1) As Long
>  Randomize Timer
>  For idx = 1 To 30 Step 3
>   For jdx = 0 To 1
>    Call get_Fract(Mol(jdx), Deno(jdx), 30) '分数の分子・分母の取得
>    Next jdx
>   Call set_計算式(Cells(idx, 1), Mol(), Deno(), _
>       Choose(Int(Rnd * 4) + 1, "+", "−", "×", "÷")) '計算式の表示
>   Next
>End Sub
>'===============================================================
>Sub get_Fract(分子 As Long, 分母 As Long, 分母lim As Long)
>'乱数値から、分数の分子・分母を作成する
>'input : 分母lim---分母のリミット値(この値以下の分母を返す)
>'output: 分子、分母
>  Dim r As Double
>  Do
>   r = Rnd
>   If r > 0 Then
>    wk = Split(WorksheetFunction.Text(r, "??/??"), "/")
     If val(wk(0)) > 0 And val(wk(0)) < val(wk(1)) And val(wk(1)) <= 分母lim Then
'      ↑訂正箇所
>      分子 = wk(0)
>      分母 = wk(1)
>      Exit Do
>      End If
>    End If
>   Loop
>  Erase wk
>End Sub
>'===============================================================
>Sub set_計算式(rng As Range, 分子() As Long, 分母() As Long, 演算子 As String)
>'指定されたセル位置を開始位置としてふたつの分数計算式を表示する
>'input : rng---表示開始セル
>'     分子()----ふたつの分数値の分子を格納した配列(引数は、0から始まる)
>'     分母()----ふたつの分数値の分母を格納した配列(引数は、0から始まる)
>'     演算子----演算子文字列を格納
>  For idx = 0 To 1
>   With rng.Offset(0, idx * 2)
>    With .Borders(xlEdgeBottom)
>      .LineStyle = xlContinuous
>      .Weight = xlThin
>      .ColorIndex = xlAutomatic
>      End With
>    .Value = 分子(idx)
>    .HorizontalAlignment = xlCenter
>    .VerticalAlignment = xlBottom
>    End With
>   With rng.Offset(1, idx * 2)
>    .HorizontalAlignment = xlCenter
>    .VerticalAlignment = xlTop
>    .Value = 分母(idx)
>    End With
>   Next idx
>  With rng.Offset(0, 1).Resize(2, 1)
>   .HorizontalAlignment = xlCenter
>   .VerticalAlignment = xlCenter
>   .MergeCells = True
>   .Value = 演算子
>   End With
>  With rng.Offset(0, 3).Resize(2, 1)
>   .HorizontalAlignment = xlCenter
>   .VerticalAlignment = xlCenter
>   .MergeCells = True
>   .Value = "="
>   End With
>End Sub
>
>プロシジャーmainを実行してみて下さい。
>アクティブシートのセルA1から計算式を10行表示するはずです。
>
>列幅や行の幅は、適当に調節して下さい。
>又、mainプロシジャーを変更すれば、
>計算式の開始位置や計算式の作成数の増減も可能です。
>
>まずは、確認してみて下さい。

【17799】Re:分数の表示は?
発言  ponpon  - 04/9/8(水) 0:31 -

引用なし
パスワード
   ichinoseさんちゃっぴさんありがとうございます。レスがつかないので諦めていました。
 とりあえず、試しました。どちらもうまくいきましたが、
 今日はもう遅いのでコードの分析は明日行います。(台風のため昨日ほとんど寝ていませんので)
 改めてお礼をしたいと思います。
 ありがとうございました。

【17844】Re:分数の表示は?
お礼  ponpon  - 04/9/8(水) 18:35 -

引用なし
パスワード
   ▼ichinose さん
 
 ヘルプなどをつかってコードを眺めてみましたが、
 「Split関数」の使い方というか配列の考え方やtext関数の使い方や引数付きのプロシ ージャについてもよくわかりません。もう少し勉強したいと思います。
  下のコードが分子分母を決定するところだと思いますが、よく理解できません。
  時間がかかると思いますが、もう少し勉強します。また、小学生ですから、マイナス はだめなので、引き算の場合は、もう一工夫が必要みたいです。
 忙しい中回答していただきありがとうございました。
 提示していただいたコードを元に研究したいと思います。
 

>Sub get_Fract(分子 As Long, 分母 As Long, 分母lim As Long)
>'乱数値から、分数の分子・分母を作成する
>'input : 分母lim---分母のリミット値(この値以下の分母を返す)
>'output: 分子、分母
>  Dim r As Double
>  Do
>   r = Rnd
>   If r > 0 Then
>    wk = Split(WorksheetFunction.Text(r, "??/??"), "/")
>    If wk(0) > 0 And wk(0) < wk(1) And wk(1) <= 分母lim Then
>      分子 = wk(0)
>      分母 = wk(1)
>      Exit Do
>      End If
>    End If
>   Loop
>  Erase wk
>End Sub
>まずは、確認してみて下さい。

【17845】Re:分数の表示は?
お礼  ponpon  - 04/9/8(水) 18:52 -

引用なし
パスワード
   ▼ちゃっぴ さん:

>    b = Int(((a - 1) * Rnd) + 1)

 上記の式がすごいですね。(私にとって)関数でする場合にいろいろと考えたのですが、文系なものですから上記の式に行き着きませんでした。(未だによく理解できていません。どうしてbがaの約数にならないのかが・・・)
 表示の方は、for nextで何とかなると思いますし、演算子ははじめから入力しておくこともできます。
 引き算の場合は、少し工夫が必要なようです。マイナスの答えは相手が小学生なので棚のです。b/aとb1/a1を比較してb/a>b1/a1になるまでloopさせればよいですね。といっても for nextはたくさん使ったことはあるのですが do loopは使ったことがないのでこのことを機に練習・学習したいと思います。
 ありがとうございました。

【17852】Re:分数の表示は?
発言  ichinose  - 04/9/8(水) 19:36 -

引用なし
パスワード
   ▼ponpon さん:
こんばんは。
台風、私の地方はほとんど被害がなかったのですが、
ponpon さんの方では大丈夫でしたか?

> ヘルプなどをつかってコードを眺めてみましたが、
> 「Split関数」の使い方というか配列の考え方やtext関数の使い方や引数付きのプロシ ージャについてもよくわかりません。もう少し勉強したいと思います。
>  下のコードが分子分母を決定するところだと思いますが、よく理解できません。
>  時間がかかると思いますが、もう少し勉強します。また、小学生ですから、マイナス はだめなので、引き算の場合は、もう一工夫が必要みたいです。
> 忙しい中回答していただきありがとうございました。
> 提示していただいたコードを元に研究したいと思います。
> 
ワークシート関数のText関数を使用して乱数値を
分数文字列に書き換えています(これ使うと約分のことを考えなくて良いから)。
その後、Split関数で"/"を区切り文字として分子と分母を配列に格納しています。

>>Sub get_Fract(分子 As Long, 分母 As Long, 分母lim As Long)
>>'乱数値から、分数の分子・分母を作成する
>>'input : 分母lim---分母のリミット値(この値以下の分母を返す)
>>'output: 分子、分母
>>  Dim r As Double
>>  Do
>>   r = Rnd
>>   If r > 0 Then
>>    wk = Split(WorksheetFunction.Text(r, "??/??"), "/")
    If Val(wk(0)) > 0 And Val(wk(0)) < Val(wk(1)) And Val(wk(1)) <= 分母lim Then
'↑ここは、こっちのコードにして下さい
>>      分子 = wk(0)
>>      分母 = wk(1)
>>      Exit Do
>>      End If
>>    End If
>>   Loop
>>  Erase wk
>>End Sub

引き算の件は、私も投稿後に気づきました。
よって、Mainプロシジャーだけちょっと変更します。
'==============================================================
Sub main()
  Dim 演算子 As String
  Dim Mol(0 To 1) As Long, Deno(0 To 1) As Long
  Randomize Timer
  For idx = 1 To 30 Step 3
   For jdx = 0 To 1
    Call get_Fract(Mol(jdx), Deno(jdx), 30) '分数の分子・分母の取得
    Next jdx
   演算子 = Choose(Int(Rnd * 3) + 1, "+", "−", "×", "÷")
'                ↑ここ、4でなく、3
   If 演算子 = "−" Then '演算子が−だったら?
    If Mol(0) / Deno(0) - Mol(1) / Deno(1) < 0 Then '答えが-だったら?
      wk = Mol(0)
      Mol(0) = Mol(1)
      Mol(1) = wk
      wk = Deno(0)
      Deno(0) = Deno(1)
      Deno(1) = wk
'     ↑データを入れ替える
      End If
    End If
   Call set_計算式(Cells(idx, 1), Mol(), Deno(), 演算子) '計算式の表示
   Next
End Sub

こんなんでどうでしょうか?
私もこれ、子供に使おう!!

【17854】Re:分数の表示は? 訂正の訂正
発言  ichinose  - 04/9/8(水) 20:04 -

引用なし
パスワード
   >よって、Mainプロシジャーだけちょっと変更します。
>'==============================================================
>Sub main()
>  Dim 演算子 As String
>  Dim Mol(0 To 1) As Long, Deno(0 To 1) As Long
>  Randomize Timer
>  For idx = 1 To 30 Step 3
>   For jdx = 0 To 1
>    Call get_Fract(Mol(jdx), Deno(jdx), 30) '分数の分子・分母の取得
>    Next jdx
   演算子 = Choose(Int(Rnd * 4) + 1, "+", "−", "×", "÷")
'                ↑やっぱり4でよかった・・
'                ボケてました 失礼しました
>   If 演算子 = "−" Then '演算子が−だったら?
>    If Mol(0) / Deno(0) - Mol(1) / Deno(1) < 0 Then '答えが-だったら?
>      wk = Mol(0)
>      Mol(0) = Mol(1)
>      Mol(1) = wk
>      wk = Deno(0)
>      Deno(0) = Deno(1)
>      Deno(1) = wk
>'     ↑データを入れ替える
>      End If
>    End If
>   Call set_計算式(Cells(idx, 1), Mol(), Deno(), 演算子) '計算式の表示
>   Next
>End Sub

【17855】Re:分数の表示は?
発言  ponpon  - 04/9/8(水) 20:26 -

引用なし
パスワード
   ▼ichinose さん:
>▼ponpon さん:
>こんばんは。
>台風、私の地方はほとんど被害がなかったのですが、
>ponpon さんの方では大丈夫でしたか?

こちらは北九州に近いですから、瓦が飛んだり木が倒れたりとひどかったです。私の学校も窓ガラスが割れ、水浸しの教室ができました。
 下記の内容は、学校から帰ってからずっと眺めています。text関数(いろいろと過去ログをみると使い道のある便利な関数のようですが)使ったことありません。ただ数字をテキストとして処理するぐらいしか知りません。
 もう少し勉強して、使えるようになりたいと思います。ichinose さんぐらいVBAの力があれば子どもにいろんなことをしてあげれるのになと思います。
 この間自動100マス計算を作って子どもにさせたら喜んでしていました。ファイルをコピーして家庭に持って帰らせました。子どもはパソコン好きですから
 話がそれましたが、これからもいろいろ未熟ながら挑戦したいと思いますのでよろしくお願いします。

>ワークシート関数のText関数を使用して乱数値を
>分数文字列に書き換えています(これ使うと約分のことを考えなくて良いから)。
>その後、Split関数で"/"を区切り文字として分子と分母を配列に格納しています。
>
>>>Sub get_Fract(分子 As Long, 分母 As Long, 分母lim As Long)
>>>'乱数値から、分数の分子・分母を作成する
>>>'input : 分母lim---分母のリミット値(この値以下の分母を返す)
>>>'output: 分子、分母
>>>  Dim r As Double
>>>  Do
>>>   r = Rnd
>>>   If r > 0 Then
>>>    wk = Split(WorksheetFunction.Text(r, "??/??"), "/")
>    If Val(wk(0)) > 0 And Val(wk(0)) < Val(wk(1)) And Val(wk(1)) <= 分母lim Then
>'↑ここは、こっちのコードにして下さい
>>>      分子 = wk(0)
>>>      分母 = wk(1)
>>>      Exit Do
>>>      End If
>>>    End If
>>>   Loop
>>>  Erase wk
>>>End Sub
>
>引き算の件は、私も投稿後に気づきました。
>よって、Mainプロシジャーだけちょっと変更します。
>'==============================================================
>Sub main()
>  Dim 演算子 As String
>  Dim Mol(0 To 1) As Long, Deno(0 To 1) As Long
>  Randomize Timer
>  For idx = 1 To 30 Step 3
>   For jdx = 0 To 1
>    Call get_Fract(Mol(jdx), Deno(jdx), 30) '分数の分子・分母の取得
>    Next jdx
>   演算子 = Choose(Int(Rnd * 3) + 1, "+", "−", "×", "÷")
>'                ↑ここ、4でなく、3
>   If 演算子 = "−" Then '演算子が−だったら?
>    If Mol(0) / Deno(0) - Mol(1) / Deno(1) < 0 Then '答えが-だったら?
>      wk = Mol(0)
>      Mol(0) = Mol(1)
>      Mol(1) = wk
>      wk = Deno(0)
>      Deno(0) = Deno(1)
>      Deno(1) = wk
>'     ↑データを入れ替える
>      End If
>    End If
>   Call set_計算式(Cells(idx, 1), Mol(), Deno(), 演算子) '計算式の表示
>   Next
>End Sub
>
>こんなんでどうでしょうか?
>私もこれ、子供に使おう!!

 子どもに使うなら足し算引き算のところは、分母を20以内にしないと通分が地獄のようになると思いますよ。(蛇足でしたか?・・・・)

11152 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free