今Rnd関数を使って問題を作ろうとしているのですが,
40問中から重複なしに20問ランダムに出題するというものを作ろうとしています。
しかし,重複を無くすためのプログラムの仕方がわかりません。
ついこの間,VBを始めたばかり(プログラムはVBが始めて)なので,
できれば詳しい解説を書いてほしいです。
今現在考えているのはこんなのです↓

Private Function RandomCnt() As Long
'*********************************
'* ランダムで問題の番号を取得 *
'*********************************

'一時的にランダムで取得した問題番号を格納
Dim RandomNo As Long

RandomNo = Int((MaxRec * Rnd) + 1) 'ランダムで番号を取得

Do While volQuizNo(RandomNo) = True 'まだ出していない問題が見つかる間
RandomNo = Int((MaxRec * Rnd) + 1) 'ランダムで番号を取得
Loop

volQuizNo(RandomNo) = True '出題問題のチェック
RandomCnt = RandomNo

End Function

A 回答 (4件)

先ほどの方法でコードを書いてみました。



1.配列を作ってそこにシリアル番号(順番)を入れます。この配列サイズは問題数です。(TanakaShinyaさんの例にもあります)
2.次にこのレコードの中身をランダムに並べ替えます。簡単な方法として、インデックス(添字)の数値と「インデックス+1」を入れ替えることを何回か行うことによって並び替えを行います。
3.後はその配列から順番にデータを取得する。

これをコードに直すと、

Option Explicit

Const DATA_MAX As Integer = 100 ' データ数
Const LOOP_MAX As Integer = 10000 ' 並べ替え用ループ数

Private s_nDataRecord(DATA_MAX) As Integer ' レコードインデックス(ランダム値)
Private s_nDataIndex As Integer ' レコードインデックスを取得するインデックス

Public Sub SetData()

Dim nCnt As Integer ' 汎用カウンタ
Dim nRnd As Integer ' ランダムな数値用
Dim nTemp As Integer ' 並べ替え時の退避用

' シリアル番号を設定
For nCnt = 1 To DATA_MAX
s_nDataRecord(nCnt) = nCnt
Next nCnt

' ランダムに並べ替え
Randomize
For nCnt = 1 To LOOP_MAX
nRnd = Int(DATA_MAX * Rnd)
nTemp = s_nDataRecord(nRnd)
s_nDataRecord(nRnd) = s_nDataRecord(nRnd + 1)
s_nDataRecord(nRnd + 1) = nTemp
Next nCnt

' 取得するインデックスの初期化
s_nDataIndex = 1

End Sub

Public Function GetData() As Integer

Dim nReturn As Integer ' 戻り値

' すべてのデータを取得し終わっていたらもう一度並べ替え
If s_nDataIndex > DATA_MAX Then
Call SetData
End If

' データ取得
nReturn = s_nDataRecord(s_nDataIndex)

' インデックスを次へ
s_nDataIndex = s_nDataIndex + 1

' 戻り値
GetData = nReturn

End Function

という感じになります。
わかりやすくするために、インデックスデータをモジュール変数にしています。(また、このサイトの制限でしょうが、インデントが全て無くなっています。(^_^;)
これを標準モジュールに組み込み、最初にCall SetDataして、あとは、GetDataを呼び出すとレコード番号が返されます。
注意としては、SetDataを呼び出さずにGetDataを呼んではいけないということです。

なお、ここでは問題数を Integerの範囲内としていますが、適当に Long等に変更してください。変更する場合は、すべての Dim宣言を変更しましょう。

このままのコードを使わずに、理解して自分のものにして使用しましょうね。
ここに書かれてあるキーワードはヘルプで検索できると思うので、詳しく見てみましょうね。

思ったより簡単でしょ?
    • good
    • 0
この回答へのお礼

どうも,お返事ありがとうございます。
最初見たときLOOP_MAX=10000ってなんだ?と思ったんですが,
読んでから,わかりました。どうやら,TanakaShinyaさんとは
少し違うようですね。今教えてもらえたのは,数値を選んでそれを前後
並べ替えという方法ですよね。確かに,これだと絶対に重複はなくなります。
こんなアルゴリズム自分ではまったく思いつきません。
ところで,最近プログラムが楽しくて仕方がありません。
もう一日中でもプログラムのことが頭から離れません。
こんな風なアルゴリズムのことを考えるだけで楽しくて仕方ありません。
そんな私ってちょっとおかしい?
なにはともあれ,ご教授ありがとうございました。
また,何か会ったらお願いします。

お礼日時:2001/02/12 09:57

ちょっと一部間違っていました。

(^_^;

並べ替えの時に配列のインデックスを1からにしているのに0が混じっちゃ駄目ですよね。

誤:
nRnd = Int(DATA_MAX * Rnd)

正:
nRnd = Int((DATA_MAX - 1) * Rnd) + 1
    • good
    • 0
この回答へのお礼

おっと,訂正ですか。
実はこの間違いはわかりました。
実は数値をひとつずつに入れていって,計算してみてこのようにすれば
うまく0を出さなくなるということがわかりました。
ところでコンピューターって人の頭脳の何倍の処理能力があるんでしょうか?
左脳の働きで比較してみると?この数値代入法?で確認しているときに
そんなことを考えながら自分の脳って遅いなーと思いました。

お礼日時:2001/02/12 10:08

私のよく使うアルゴリズムは次のようなものです。



まず、問題番号のIndexを入れたテーブルを作成します。

Const c_MaxQuizNum = 40 ' 全問題数
Const c_QuizNum = 20 ' 出題数

Dim QuizIndex(c_MaxQuizNum) As Integer ' 問題の Index 格納用
Dim QuizLastNum as Integer ' 問題の残り数
Dim TmpRndm As Integer ' 選択された値
Dim RandomNo As Integer ' 選択された問題番号
Dim i As Integer

For i = 1 To c_MaxQuizNum
 QuizIndex(i) = i '初期値を格納
Next

これを利用し、重複しない問題番号を取り出すことが可能です。

QuizLastNum = c_MaxQuizNum ' 問題の残り数初期化

For i = 1 To c_QuizNum
 TmpRndm = Int((QuizLastNum * Rnd) + 1) ' 1~QuizLastNum の乱数
 RandomNo = QuizIndex(TmpRndm) ' 問題番号を取得
 QuizIndex(TmpRndm) = QuizIndex(QuizLastNum) ' 問題の選択肢をつめる
 QuizLastNum = QuizLastNum - 1 ' 問題の残り数を減らす
 ' 以降、ユーザ処理
Next

つまり、簡単な例として c_MaxQuizNum = 5 としたとき、
QuizIndex には、 1 , 2 , 3 , 4 , 5 が順に入っています。
QuizLastNum には c_MaxQuizNum = 5 が入っていますね。

ここで、出題用の For ループ処理を始めると
TmpRndm は 1~5 のいずれかの整数が入ります。
よって、RandomNo には 1 , 2 , 3 , 4 , 5 のいずれかが選ばれるわけです。
そして、ここからがミソなのですが、今仮に TmpRndm に 3 が選ばれるとします。
QuizIndex(TmpRndm) = QuizIndex(QuizLastNum)
の処理により、QuizIndex には、 1 , 2 , 5 , 4 , 5 が入るわけです。
そして、QuizLastNum の値を 1 減らします。
すると 2 回目の For ループは どうなるでしょうか?
TmpRndm は QuizLastNum を減らしたため 1~4 のいずれかの整数が入ります。
よって、RandomNo には 1 , 2 , 5 , 4 のいずれかが選ばれ、
先ほど出題した 3 は選択されません。

重複を無くし、かつ効率の良い方法でしょう?
このアルゴリズムおわかりいただけましたでしょうか?

この回答への補足

プログラムの意味はよくわかりました。
でも,「以降ユーザー処理」をどのようにしたらいいのかわかりません。
それと,RandomNoをどのように使ったらいいのかもわかりません。
まだ,配列もわからない状態で,やれ「インデックス~」とか「定数式がひつようです」とかエラーが大量に出てくる始末です。
何とか,自分で工夫してRandomNoのところをQuizrecord(20)とかいう配列にして
QuizIndex(TmpRndm) から来るランダムな数値を格納して20までループして
Quizrecord(20)を問題の順序に使用かとしたのですが,同じ乱数が同じ順序で出てきます。(8,9,7,5,2とか,これが何度も出る。)そのあたりもちょっとわかりにくい説明ですが,アドバイスいただけないでしょうか。お願いします。

補足日時:2001/02/10 00:25
    • good
    • 0
この回答へのお礼

どうもありがとうございました。
いろいろなエラーもKojiSさんのアルゴリズムと見比べてみて
両方のアルゴリズムともにうまくいくようになりました。
話は違うんですが,なんかアルゴリズムって響きがいいですよね?
TanakaShinyaさんに聞いてなんか気に入ってよく使っています。

お礼日時:2001/02/12 10:02

シリアル番号の配列を作って、それをランダムに並べ替えして、順番にその番号を取得するのが確実かつ簡単だと思います。

    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
この方法は「TanakaShinya」さんと同じ方法のようですね。
自分から,ランダムに番号を作るんじゃなくて並べ替えるという方法が
とてもわかりやすいです。
一日かけて重複なしのランダム関数を作ろうとしていたのですが,
ついにわからずじまいでした。もっと勉強しなくちゃ。
こういう風な直接な回答じゃなくてもどんな風に考えるかという回答でも
とても助かります。

お礼日時:2001/02/10 00:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルで種類を数える関数が無いのは何故?

エクセルで種類を数える関数が無いのは何故なんでしょうか?

エクセルで種類を数えるには、いくつかの関数を組み合わせるのが一般的ですよね?
直接数える関数が無いのは、訳があるんでしょうか?

Aベストアンサー

>>エクセルで種類を数える関数が無いのは何故なんでしょうか?

やっぱり、そういう関数が必要な方が全体からみたら少数派だと、エクセルの開発者たちが考えているからではないかと思います。
また、既存の関数を組み合わせたら、対処可能だから、無理して新しい関数を作る必要性もない、開発の優先順位が低いって判断もあるでしょうね。

私は、エクセルの表を作ったり、エクセルVBAでプログラムを作ったりしますけど、そういう関数が必要になったことが全くありませんし。

QRst.FindFirst "名称コード" & "=" & "'101'"

タイトルのコードでは問題ないのですが、 101 を文字変数にすると「抽出条件でデータ型が一致していません」のエラーになります。この場合シングルクオーテーションはどういう意味なのでしょうか。
どうすれば良いのでしょうか。

dim Vcode as string
Vcode = "101"
Rst.FindFirst "名称コード" & "=" & Vcode

Aベストアンサー

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます。
そこで、

rst.FindFirst "フィールド名 = 'xxx'"

このようにすればOKです。
次のステップとして、xxx の部分を変数を使ってやりたい場合。
単純に変数名に置き換えると、

rst.FindFirst "フィールド名 = '変数名'"

ですが、変数を、"" の中に記述すると、文字列として扱われますので、"" の外に
出してやる必要があります。
その場合、文字列と変数をつなぐためには、& を使います。

rst.FindFirst "フィールド名 = '" & 変数名 & "'"

で、このようになります。

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます...続きを読む

Qエクセルの関数で

エクセルの関数辞典を見ていたら、CUMPRINC関数というのがありました。
しかし、エクセルの「挿入」→「関数」→関数の分類で「財務」というのを選択したのですが、一覧表に載っていません。
どこに載っているのでしょうか?
どうすればこの関数を使えますか?
ちなみにシートの上でやっても関数の反応をしませんでした。

Aベストアンサー

Yahooで検索してみると、参考URLが引っかかりました。

参考になりませんか?

参考URL:http://money-sense.net/doc/20041215_224257.php

Q4択問題のプログラムでランダムに出題する処理で困っています

現在私は画像のような4択の問題を解答し最後に何問正解していたかを表示するプログラムを作成しています。

解答を選択して「次の問題」ボタンをクリックすれば次の問題に移行する・・・というような流れです。

データテーブルに「問題(Question)」「選択肢(Answer1~4)」「解答(SelectAnswr)」「正解(CorrectAnswer」「正解の解説(Explanation)*今質問中では使用させません」を格納しています。

最終的な目標はデータテーブルに問題を300問用意しその中からランダムに100問出題して最後に結果を表示するプログラムを作成することです。

今どうすればランダムに出題しつつ同じ問題が出題されないようにするプラグラムを組めばいいのか壁にぶつかっています。

下記が「次の問題」ボタンのプログラムです。


Private Sub NextQuestion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextQuestion.Click

' i が -1 のとき(つまり、初回のクリック)
If i = -1 Then
'選択肢を選択可能にする
GroupBox1.Enabled = True

'NextQuestionのテキスト変換
NextQuestion.Text = "次の問題"
' i が -1以外のとき(つまり、回答後のクリック)
Else
'正誤確認
If Answer1.Checked = True Then
DataSet1.DataTable1(i).SelectAnswer = "ア"
ElseIf Answer2.Checked = True Then
DataSet1.DataTable1(i).SelectAnswer = "イ"
ElseIf Answer3.Checked = True Then
DataSet1.DataTable1(i).SelectAnswer = "ウ"
ElseIf Answer4.Checked = True Then
DataSet1.DataTable1(i).SelectAnswer = "エ"
End If

If DataSet1.DataTable1(i).SelectAnswer = DataSet1.DataTable1(i).CorrectAnswer Then
total = total + 1
End If

End If

i += 1 ' i をインクリメント(出題を次に進める)

' i が10になった = 回答が10問終わった
If i = 10 Then
MsgBox("あなたの正解数は10門中" & total & "問です!")
Me.Close()
Else
'問題の読み込み
Question.Text = DataSet1.DataTable1(i).Question
Answer1.Text = DataSet1.DataTable1(i).Answer1
Answer2.Text = DataSet1.DataTable1(i).Answer2
Answer3.Text = DataSet1.DataTable1(i).Answer3
Answer4.Text = DataSet1.DataTable1(i).Answer4

'ラジオボタンを初期位置に戻す
Answer1.Checked = True
End If


End Sub

*変数iはPublicで宣言しています。
*最終目標は100問出題なのですが今は10問で動くプログラムを作成しています。

わかるかたがいましたら知恵をかしてください。
お願いします。

現在私は画像のような4択の問題を解答し最後に何問正解していたかを表示するプログラムを作成しています。

解答を選択して「次の問題」ボタンをクリックすれば次の問題に移行する・・・というような流れです。

データテーブルに「問題(Question)」「選択肢(Answer1~4)」「解答(SelectAnswr)」「正解(CorrectAnswer」「正解の解説(Explanation)*今質問中では使用させません」を格納しています。

最終的な目標はデータテーブルに問題を300問用意しその中からランダムに100問出題して最後に結果を表...続きを読む

Aベストアンサー

まず「次の問題に進む時、問題の参照にiを使わず、乱数で求めた0~299の値を使う」と言うように変更しましょう。

そして「初期化時や無回答で次の問題に進んだ時の、解答(SelectAnswr)にセットする値を工夫する事で、未出題か出題済みか判定する」と言う処理をして、問題の重複を避けましょう。

ヒントだけ。

ヒントは以下の通り。

ヒント1.
「解答(SelectAnswr)」に入る値を「回答された"ア"~"エ"」「無回答でスキップした"S"」「まだ出題してない""」の3種類にする。
(無回答でのスキップが出来ない、つまり、選択肢のどれかを選ばないと「次の問題」ボタンが押せない、と言う処理の場合「無回答でスキップした"S"」は不要)

ヒント2.
最初の初期化時に「300件全部、解答(SelectAnswr)の値を""にして、すべて未出題」にする。

ヒント3.
出題時に問題を参照する時「DataSet1.DataTable1(i).ほげほげ」のように「(i)」で参照するのをやめる。
代わりに、乱数で「解答(SelectAnswr)の値が、まだ出題してない""になっている問題」を探す。
つまり「乱数で0~299の値を作り、解答(SelectAnswr)の値が""なら、その乱数が出題番号になり、解答(SelectAnswr)の値が""じゃないなら乱数の作り直し」をすればよい。

ヒント4.
変数の「i」は「最初は-1」「1題出題するごとに1を足す」「100題目が終わったら終了」の目的以外には使わない。
つまり「DataSet1.DataTable1(i).ほげほげ」っていう書き方を全部無くす。

ヒント5.
選択肢を選ばずに「次の問題」を押してしまった場合「解答(SelectAnswr)」の値が「まだ出題してない""」のまま次に進んでしまっては困るので、次に進む前に「解答(SelectAnswr)の値を"S"にする」と言う処理をして「出題済み」にする。
(無回答でのスキップが出来ない、つまり、選択肢のどれかを選ばないと「次の問題」ボタンが押せない、と言う処理の場合、この処理は不要)

ヒントは以上。

なお、この方法は「300問中100問」などのように、最後の100問目に近い時も未出題の問題が多い場合は問題ありませんが「すべての問題を出題する」などの場合、最後の問題に近くなると未出題の問題が減り「残りの問題が乱数にヒットせず、次の問題に進む際に時間がかかる」と言う欠点があるので注意して下さい。今回のように「300問中100問」であれば問題はありません。

まず「次の問題に進む時、問題の参照にiを使わず、乱数で求めた0~299の値を使う」と言うように変更しましょう。

そして「初期化時や無回答で次の問題に進んだ時の、解答(SelectAnswr)にセットする値を工夫する事で、未出題か出題済みか判定する」と言う処理をして、問題の重複を避けましょう。

ヒントだけ。

ヒントは以下の通り。

ヒント1.
「解答(SelectAnswr)」に入る値を「回答された"ア"~"エ"」「無回答でスキップした"S"」「まだ出題してない""」の3種類にする。
(無回答でのスキップが...続きを読む

Qエクセルの関数 ネスト

エクセルの関数 ネスト

エクセルの関数で、ネストさせるときがあるとおもうのですが、

関数を内側に書いたらよいのか外側に書いたらよいのか分からなくなる時があります。

エクセルの関数に関してわかりやすく書いてあるページなどありますか。

Aベストアンサー

こんばんは

Excel2003までは、ネストが7まで、2007では64までが可能です。
http://www.google.co.jp/search?hl=ja&source=hp&q=excel+%E3%83%8D%E3%82%B9%E3%83%88%E3%80%802003%E3%80%802007&aq=f&aqi=&aql=&oq=&gs_rfai=

「仕様上は可能」でも、複雑なネストは間違いが生じやすいですし、変更もしにくくなります。「出来るだけネストはしない」「適宜、中間結果をセルに出力する」という方法を採った方が、間違いが少なく、柔軟性のあるシステムになると思います。

>エクセルの関数に関してわかりやすく書いてあるページなどありますか。
関数の個別の機能ならば、Webサイトも書籍も多数あるのですが、「組み合わせて使う」というのはその場その場での発想になってしまうと思います。

Q'2465'指定した式で参照している'直線Aii'フィールドが見つかり

'2465'指定した式で参照している'直線Aii'フィールドが見つかりません。

入力されたテキストDELTUKIをiiにセットして直線Aii~Ciiに反映させたいです。
DELTUKIには0~12までのどれかがセットされて、00の場合には未可視、それ以外は
該当月の直線Aii~Ciiを可視化させたいです。
ですが、上記エラーが発生します。
どなたかご指南頂きたくよろしくお願い致します。
※.メイン画面の画像添付参照願います。
※.vba vb6 winXP
SetLowerLine:
With objrep
!直線103.Visible = True
!直線104.Visible = True
!直線105.Visible = True
!直線106.Visible = True
!直線107.Visible = True
End With
'Reports(stdocname)!直線103.Visible = True
'Reports(stdocname)!直線104.Visible = True
'Reports(stdocname)!直線105.Visible = True
'Reports(stdocname)!直線106.Visible = True
'Reports(stdocname)!直線107.Visible = True

Format ("00")
ii = Forms!メイン画面![テキストDELTUKI]
If ii = "00" Then
Else
objrep.Controls("直線A" & "ii").Visible = True
objrep.Controls("直線B" & "ii").Visible = True
objrep.Controls("直線C" & "ii").Visible = True
End If

'2465'指定した式で参照している'直線Aii'フィールドが見つかりません。

入力されたテキストDELTUKIをiiにセットして直線Aii~Ciiに反映させたいです。
DELTUKIには0~12までのどれかがセットされて、00の場合には未可視、それ以外は
該当月の直線Aii~Ciiを可視化させたいです。
ですが、上記エラーが発生します。
どなたかご指南頂きたくよろしくお願い致します。
※.メイン画面の画像添付参照願います。
※.vba vb6 winXP
SetLowerLine:
With objrep
!直線103.Visible = True
!直線104....続きを読む

Aベストアンサー

すみません、先日のこちらのご質問での回答者です:
http://oshiete1.goo.ne.jp/qa5770608.html

前回の回答2への補足の件のうち、「(2)」と「(3)」については
結局私では対処法の見当をつけかねたままなのですが(汗)、
本件についてだけはどうにかなりそうなので、回答をつけさせて
戴きます。

・・・というか、前回「"」を外すことを指摘した際に気づいて
いればよかったのですが、これも見落としていました(汗)
以下の部分を、下記のように修正してください。

【現在】
Format ("00")
ii = Forms!メイン画面![テキストDELTUKI]

If ii = "00" Then
Else
  objrep.Controls("直線A" & "ii").Visible = True
  objrep.Controls("直線B" & "ii").Visible = True
  objrep.Controls("直線C" & "ii").Visible = True
End If

【修正】
'変数「ii」に対して、Format関数で桁表示を指定
ii = Format(Forms!メイン画面![テキストDELTUKI], "00")

If ii = "00" Then
Else
  '「ii」を変数として使用するため、「"」は外します
  objrep.Controls("直線A" & ii).Visible = True
  objrep.Controls("直線B" & ii).Visible = True
  objrep.Controls("直線C" & ii).Visible = True
End If


・・・以上です。

これで、「テキストDELTUKI」に1桁の数字(「1」や「2」など)を
指定した場合も、「直線A01」や「直線A02」に処理が行われる
ようになると思います。

すみません、先日のこちらのご質問での回答者です:
http://oshiete1.goo.ne.jp/qa5770608.html

前回の回答2への補足の件のうち、「(2)」と「(3)」については
結局私では対処法の見当をつけかねたままなのですが(汗)、
本件についてだけはどうにかなりそうなので、回答をつけさせて
戴きます。

・・・というか、前回「"」を外すことを指摘した際に気づいて
いればよかったのですが、これも見落としていました(汗)
以下の部分を、下記のように修正してください。

【現在】
Format ("00")
ii = For...続きを読む

Qエクセル関数の解読サイトなんてありますか?

エクセル関数の解読サイトなんてありますか?

いつもお世話になっております<(_ _)>

エクセルファイルに関数の入った数式が入力されています。
セルごとに複数の関数が入っていますが、私にはちっともわかりません。

そこで質問です。
こんなとき「エクセル関数を解読」してくれるようなサイトってありませんか?

たとえば検索窓があってそこに「=SUM(S1:S13)」わからなくて困っている関数式を入力。
すると答えの別ボックスに「S1~S13までの数値の合計」と出てくるようなサイト。

それに近いサイトでも良いので知っている方がいらっしゃればぜひ、教えてください<(_ _)>

Aベストアンサー

もし、

=IF(E14="","",IF(O14="",(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1300,(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1625))

だったら、どういう文章が出て欲しいのでしょうか?

もしE14が空白だったら、
 空白、
そうじゃなかったから、
 もしO14が空白だったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1300
 そうじゃなかったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1625

って感じですか?
数式をそのまま読解したほうが解りやすくないですか?

Q4桁の数字を A*1000+B*100+C*10+D 以外で表現したい。

A=1
B=2
C=3
D=4

のとき 
1234をA*1000+B*100+C*10+D以外で表現したいのですが
何かいい方法がないでしょうか?
4桁ならいいんですが
15、6桁を10行ぐらいコーディングしないといけないのでなえてます↓助けてください。

Aベストアンサー

No.4です。

VB2005でも問題なくできますよ。実際に確認済みです。

Dim A As Integer = 1
Dim B As Integer = 2
Dim C As Integer = 3
Dim D As Integer = 4
Dim E As integer

E = (A & B & C & D) * 1
MsgBox(E)

これで試してください。

Qエクセル関数を、書き写して分析できるツールはある?

タイトルの件、質問します。

エクセルの関数を分析する際に、エクセルの数式バーや、セルに入っている関数を
F2を教えて見るのでは、見にくい場合があります。

現在は、私は、メモ帳に関数をコピーして、分析したり、修正したりしています。
エクセルの機能or他ソフトで、関数を分析できるツールはあるのでしょうか??

【エクセルバージョン】
2003、2007

Aベストアンサー

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利な方法です。
そもそも計算が通っていない(たとえばカッコの対応が間違えていて,Enterしても受け付けてくれないようなミスをしている場合)には使えません。



また,数式バーの中で数式の「中」にカーソルを入れて左右の矢印キーでカーソルを動かしていったときに,「(」や「)」をまたいだ瞬間に,対応する「閉じカッコ」「始まりのカッコ」が色つきで強調表示されるのを確認しながら,カッコの対応がまちがえてないかなどを調べるのも簡易な良い方法です。


あまり使わない方法ですが,数式の中で適宜ALT+Enterを打って「セル内改行」してしまい,数式を縦に分解して書いてみるのも整理しやすい方法のひとつです。

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利...続きを読む

QMultiLine=TrueのTextBoxでEnterキー

Visual Basic 6.0で、TextBoxでEnterが押されたら次のコントロールへ移動させているのですが、
MultiLine=Trueの場合、TextBox内で改行されてから次のコントロールへ移動してしまいます。
TextBox内で改行されたくはないのですが、何か回避方法はありますか?
(10文字分の幅のTextBoxに20文字入力するため、折り返しはされて欲しいのです。)

Aベストアンサー

KeyPressイベント内でKeyAscii=0とすれば入力をキャンセルできますよ。


人気Q&Aランキング

おすすめ情報