Excel VBA質問箱 IV

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

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


201 / 3841 ページ ←次へ | 前へ→

【78448】Re:数字の出てくる確立を変更したいので...
質問  m  - 16/9/24(土) 14:37 -

引用なし
パスワード
   ▼m さん:
>>γ さん
>
>返信ありがとうございます。
>
>>Rnd()は[0,1)の小数を返します。
>>それと0.85 とを比較して、
>>0.85以下なら系列Aを選び、そうでなければ系列Bを選ぶ、
>>このようにすれば、
>>0.85の確率で系列Aを選び、0.15の確率で系列Bを選ぶことになる。
>
>なるほど!Rndの後に、()だけにすることで、小数を返すことができるのですね!
>ありがとうございます!
>
>
>>ところで、
>>使用系列  A A B B B B
>>数字   1 2 1 3 2 3 4
>>ここで行き止まりになりますな。
>>このあとどうするのですか? これで終わりでよいのですか?
>
>
>どのように説明すればいいのか、とても難しいのですが…
>
>論文に載っていた系列例を見にくいかもしれませんが書いてみます。
>
>1→2→1→4→3→ 1→4→ 3→2→4→1→3→4→2→3→1→2→1→ 3→ 4→2→3→…
>{系 列 A } {B} {  系   列    A    }{B}{系列A}
>
>
>A系列:1→2→1→4→3→2→4→1→3→4→2→3
>
>B系列:1→2→4→3→1→4→2→1→3→2→3→4
>
>
>4→3と数字が並ぶ度に、A系列に進むか、B系列に進むかを選択し、
>どちらかの系列の並び順に入り込み、次の数字が選ばれます。
>例えば、上記の系列例で行けば、
>4→3と数字が並んだとき、15%の確率で次の数字が1となり、B系列に入ります。
>ここで、85%の確率で次の数字に2が選択され、A系列にままとどまる可能性もあります。
>
>B系列に入った後、1→4と数字が並ぶと、またA系列に進むか、B系列に進むか、確率によって選択されます。
>上記の系列例では、
>1→4と数字が並んだとき、85%の確率で次の数字が3となり、A系列に入ります。
>しかし、15%の確率で次の数字が2となり、B系列にとどまる可能性もあります。
>
>つまり、
>1→4と数字が並んだとき
>4→3と数字が並んだとき
>2→1と数字が並んだときは
>毎回必ず、どちらの系列に進むかを確率で決定し、
>決定した系列の方へ侵入し、
>その系列で決まっている並び順(上記のA系列とB系列の順番)に数字が配置されるという法則となっています。
>
>
>実験の試行としては、
>1つの数字で1試行と考え、100回連続して試行続けたいと考えています。
>つまり、この法則で100こ数字を並べたいと思っています。
>
>
>紹介した論文は、PDFが無料でダウンロードできるはずです…
>著者は、Scott Barry Kaufamらです。
>
>Scott Barry Kaufam, Colin G. DeYoug, Jeremy R. Gray, Luis Jimenz, Jamie Brown, Nicholas Machintosh. (2010). Implicit learning as an ability. Cognition, 116(2010), 321-340.
>
>
>なるほどスペースを挟むとURLが載せられるのですね。
>ht tp: // sco ttba rryk aufma n.c om/wp-con ten t/u plo ads/2 011/06/ Kau fman-et-al.-20 10. pdf
>
>
>乱雑にスペースを挟んでいるので、見にくいかもしれません…
>慣れないもので、本当にすいません…
>
>また、いろいろとご足労をおかけしてしまって、本当に申し訳ありません。
>
>このように助けていただいて、とても助かっています。
>
>よろしくお願いいたします。
・ツリー全体表示

【78447】Re:数字の出てくる確立を変更したいので...
質問  m  - 16/9/24(土) 14:27 -

引用なし
パスワード
   >γ さん

返信ありがとうございます。

>Rnd()は[0,1)の小数を返します。
>それと0.85 とを比較して、
>0.85以下なら系列Aを選び、そうでなければ系列Bを選ぶ、
>このようにすれば、
>0.85の確率で系列Aを選び、0.15の確率で系列Bを選ぶことになる。

なるほど!Rndの後に、()だけにすることで、小数を返すことができるのですね!
ありがとうございます!


>ところで、
>使用系列  A A B B B B
>数字   1 2 1 3 2 3 4
>ここで行き止まりになりますな。
>このあとどうするのですか? これで終わりでよいのですか?


どのように説明すればいいのか、とても難しいのですが…

論文に載っていた系列例を見にくいかもしれませんが書いてみます。

1→2→1→4→3→ 1→4→ 3→2→4→1→3→4→2→3→1→2→1→ 3→ 4→2→3→…
{系 列 A } {B} {  系   列    A    }{B}{系列A}


A系列:1→2→1→4→3→2→4→1→3→4→2→3

B系列:1→2→4→3→1→4→2→1→3→2→3→4


4→3と数字が並ぶ度に、A系列に進むか、B系列に進むかを選択し、
どちらかの系列の並び順に入り込み、次の数字が選ばれます。
例えば、上記の系列例で行けば、
4→3と数字が並んだとき、15%の確率で次の数字が1となり、B系列に入ります。
ここで、85%の確率で次の数字に2が選択され、A系列にままとどまる可能性もあります。

B系列に入った後、1→4と数字が並ぶと、またA系列に進むか、B系列に進むか、確率によって選択されます。
上記の系列例では、
1→4と数字が並んだとき、85%の確率で次の数字が3となり、A系列に入ります。
しかし、15%の確率で次の数字が2となり、B系列にとどまる可能性もあります。

つまり、
1→4と数字が並んだとき
4→3と数字が並んだとき
2→1と数字が並んだときは
毎回必ず、どちらの系列に進むかを確率で決定し、
決定した系列の方へ侵入し、
その系列で決まっている並び順(上記のA系列とB系列の順番)に数字が配置されるという法則となっています。


実験の試行としては、
1つの数字で1試行と考え、100回連続して試行続けたいと考えています。
つまり、この法則で100こ数字を並べたいと思っています。


紹介した論文は、PDFが無料でダウンロードできるはずです…
著者は、Scott Barry Kaufamらです。

Scott Barry Kaufam, Colin G. DeYoug, Jeremy R. Gray, Luis Jimenz, Jamie Brown, Nicholas Machintosh. (2010). Implicit learning as an ability. Cognition, 116(2010), 321-340.


なるほどスペースを挟むとURLが載せられるのですね。
ht tp: // sco ttba rryk aufma n.c om/wp-con ten t/u plo ads/2 011/06/ Kau fman-et-al.-20 10. pdf


乱雑にスペースを挟んでいるので、見にくいかもしれません…
慣れないもので、本当にすいません…

また、いろいろとご足労をおかけしてしまって、本当に申し訳ありません。

このように助けていただいて、とても助かっています。

よろしくお願いいたします。
・ツリー全体表示

【78446】Re:数字の出てくる確立を変更したいので...
発言  γ  - 16/9/24(土) 13:54 -

引用なし
パスワード
   Rnd()は[0,1)の小数を返します。
それと0.85 とを比較して、
0.85以下なら系列Aを選び、そうでなければ系列Bを選ぶ、
このようにすれば、
0.85の確率で系列Aを選び、0.15の確率で系列Bを選ぶことになる。

ところで、
使用系列  A A B B B B
数字   1 2 1 3 2 3 4
ここで行き止まりになりますな。
このあとどうするのですか? これで終わりでよいのですか?

なお、
紹介論文は 有料($39.95)ですね。買って回答して欲しいと?
無料のPDFか何かあるんですか?
HT TPのようにスペースをはさんでurlを書けば問題がないですよ。
・ツリー全体表示

【78445】Re:数字の出てくる確立を変更したいので...
質問  m  - 16/9/24(土) 13:01 -

引用なし
パスワード
   >γ さん

早速の返信、本当にありがとうございます。


すいません。本当に初心者のため
以下の部分が、よくわかりませんでした。

>普通は[0,1)間の一様乱数を発生させて、
>それと閾値との大小比較した結果で、
>使用する系列を使い分けるということになるのでしょうね。


(0, 1)の一様な乱数を作成するというのは、

j = Int(((1 - 0 + 1) * Rnd) + 1)

という式で乱数を作成したらよいのでしょうか?
また、「閾値との大小比較」は、どのように行ったらよいのでしょうか?
また、使用する系列をどのように指定したら良いのでしょうか?


知識がなく本当にすいません汗
また、たくさん質問をしてしまい、本当にすいません。


あと、この刺激の配置は、
以下の論文を参考に作成しようとしています。
(リンクを張ろうと思ったのですが、張ることができなかったので、論文タイトルを掲載しておきます。)

論文タイトル:Implicit Learning as an ability.


全編英語なのですが、こちらの論文のmethodを読んでいただけると
より、どのような刺激を作成したいのかが
伝わりやすいかもしれない…と思いました。
(この論文の5ページ目からmethodが始まり、6ページ目に実験の系列の作成例を示した図が載っています。)


私自身も、いろいろ調べて、頑張ってプログラム組んでみようと思っています。
何卒、よろしくお願いいたします。
・ツリー全体表示

【78444】Re:数字の出てくる確立を変更したいので...
発言  γ  - 16/9/24(土) 12:18 -

引用なし
パスワード
   普通は[0,1)間の一様乱数を発生させて、
それと閾値との大小比較した結果で、
使用する系列を使い分けるということになるのでしょうね。

乱数はVB標準のRnd関数を使うか、
それで不十分ならMTなども使用可能でしょう。
・ツリー全体表示

【78443】数字の出てくる確立を変更したいのですが...
質問  m  - 16/9/24(土) 11:35 -

引用なし
パスワード
   こんにちは。
はじめまして。

大学の研究で実験ソフトを用いて急遽プログラムを組んで実験をしないといけなくなり、今必死で勉強をしている、プログラミング初心者の者です。
VBAも初心者のため、わからないことだらけです。


実験課題作成中にわからないことが発生したため、質問させていただいています。


今、SRTT(系列反応時間課題)という実験課題を作成しています。

SRTTというのは、画面上に4つの四角があり、その四角の中に*が「ある決まり」に沿って発生し、*の出てきた位置に対応するボタンを早く・正確に押してもらうという課題です。
「ある決まり」というのは、1〜4までの数字を使ったある系列(例えば、1-4-2-3-4-1-2-3-1-3-2-4)の順番に繰り返し画面に*が現れる、などのように、*が出てくる順序がある法則で決まっている、ということです。


通常のSRTTでは、1つの決まった系列の順序に沿って、繰り返し*が現れるだけなのですが…
今回私が作成しているSRTTは、少し複雑なのです。

まず、決まった順序が2種類あります。

1つは、Aという系列
A:1→2→1→4→3→2→4→1→3→4→2→3

もう1つはBという系列です。
B : 1→2→4→3→1→4→2→1→3→2→3→4

これら2つの系列は、「2つの数字の並び順によって、次に来る数字が決まる」という法則にのっとって決められています。
(例えば、1が来て、次に3が来ると、自動的に次の数字は4となる)

しかし、1→2と来たら、A系列では次は1、B系列では次は4というように、A系列とB系列では、2つの数字の組み合わせの後に来る数字が異なっています。


実験では、
これら2つの異なった系列を決まった確率で交換しながら刺激を提示したいと考えています。

交換できるポイントは3つあります。
4→3と並んだところと、1→4と並んだところと、2→1と並んだところです。

4→3と数字が並んだら、85%の確率で次に2が来てA系列の並び順で刺激を提示し、15%の確率で次に1が来てB系列の並び順で刺激を提示します。

1→4と数字が並んだら、85%の確率で次に3が来てA系列の並び順で刺激を提示し、15%の確率で次に2が来てB系列の並び順で刺激を提示します。

2→1と数字が並んだら、85%の確率で次に4が来てA系列の並び順で刺激を提示し、15%の確率で次に3が来てB系列の並び順で刺激を提示します。


「2つの数字の組み合わせで次が決定する」というプログラムをVBAでやってみて、A系列だけ、B系列だけであれば、うまく動かすことができました。

しかし、2つの系列を決まった確率で交換し、
交換した後は、それぞれの系列の順序に従って数字が選ばれるというプログラムが
どうしてもできません。


指導教官とも相談をしているのですが、
指導教官は、「ずいぶん昔にプログラムやったから、もうやり方忘れちゃった〜。mさん頑張ってよ〜」と話していて、アドバイスがもらえない状況です。


皆さん、お力を貸していただけませんでしょうか。

どうか、よろしくお願いします。


補足です。

エクセルで実験を行うわけではなく、
あくまで刺激を提示する順序をVBAで作成し、その順序で実験用の刺激配置を変更し、実験を行おうと思っています。
よろしくお願いします。
・ツリー全体表示

【78442】Re:セルに文字列が入力されたらマクロの...
発言  γ  - 16/9/24(土) 11:07 -

引用なし
パスワード
   エラー内容の説明も、XXXの説明もないので、質問として未完了です。
このままいくら待っていても、回答は出てこないと思います。
・ツリー全体表示

【78441】Re:セルに文字列が入力されたらマクロの...
発言  γ  - 16/9/23(金) 18:10 -

引用なし
パスワード
   >Private Sub Worksheet_Change(ByVal Target As Range)でエラーとなります。
どのようなエラーメッセージが出るのでしょうか。
・ツリー全体表示

【78440】Re:セルに文字列が入力されたらマクロの...
発言  γ  - 16/9/23(金) 17:40 -

引用なし
パスワード
   標準モジュールにあるxxxでシート上のセル値を変更していませんか?
xxxの内容を示してみてはいかがですか?
・ツリー全体表示

【78439】セルに文字列が入力されたらマクロの実行
発言  北風  - 16/9/23(金) 16:43 -

引用なし
パスワード
   Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$N$5" And IsNumeric(Target) = True Then
call xxx
End If
End Sub
上記コードを見つけてN5に文字列を入力しXXXを実行作動させてみましたが、
Private Sub Worksheet_Change(ByVal Target As Range)でエラーとなります。
N5は結合されております(N5:Q5)
XXXは標準モジュールに記載されております
・ツリー全体表示

【78438】Re:Match関数の使い方
発言  γ  - 16/9/23(金) 10:52 -

引用なし
パスワード
   ところで、
> Range(Cells(3, 6), Cells(PL, 6))のところに計算式に
> =+A48&" "&B48&" "&C48&" "&D48がはいっているためデータが読み出しが
> できません。計算式がなく入力したものは検出できます。
の原因は判明したのですか?
式の結果に対してマッチするかどうかです、式があるかは無関係です。

急かす意図はないのですが、気にはなりました。
まあ、マイペースでゆっくり取り組んでください。

なお、むやみに全文引用せずに必要な範囲で引用するのが普通です。
気をつけた方がよろしいかと思いました。
それではこれで。
・ツリー全体表示

【78437】Re:Match関数の使い方
お礼  tomi  - 16/9/23(金) 10:41 -

引用なし
パスワード
   ▼γ さん:
>追加で少しコメントしておきます。
>
>On Error Resume Next
>としているのでエラーが隠蔽されますが、このケースでは少なくとも2種類のエラーがありえます。
>(1)マッチするものがないことによるエラー
>(2)セル範囲の指定に不備があって発生するエラー
>
>両方を区別せずに、見逃してしまうOn Error Resume Nextの使用は、
>できるだけ避けたほうが良いと思います。
>(実際、この場合は、エラーにならないので、(2)に気づかなかったのでしょう)
>
>---------------
>まず(2)については、
>  Sheet1がアクティブであるときに、
>      Sheet2.Range(Cells(1,1),Cells(5,1))
>  などと書くことによるエラー。(今回のケースはこれです。)
>      Sheet2.Range(Sheet1.Cells(1,1),Sheet1.Cells(5,1))
>  と書いているのと同じですから、Excel君が混乱を来すのです。
>こうしたものはむしろエラーになるべきなんです。
>
>---------------
>次に(1)ですが、
>AA = Application.WorksheetFunction.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
>ではなく、
>AA = Application.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
>とすることで、エラーで止まるのを避けることができます。
>
>該当が無い場合には、エラーを示す情報がAAに返りますから、
>If IsError(AA) Then などとして、マッチの有無を判定することができます。
>
>詳しくは、例えば、
>ht tps://www.moug.net/tech/exvba/0100035.html
>をごらんください。
ありがとうございました。確かにエラー回避はプログラム進行の為必要との
単純な考えでやってしまいました。どこにエラーがあるかわかれば非常に良いことです。もう一度じっくり勉強してみます。
・ツリー全体表示

【78436】Re:Match関数の使い方
発言  γ  - 16/9/22(木) 21:09 -

引用なし
パスワード
   追加で少しコメントしておきます。

On Error Resume Next
としているのでエラーが隠蔽されますが、このケースでは少なくとも2種類のエラーがありえます。
(1)マッチするものがないことによるエラー
(2)セル範囲の指定に不備があって発生するエラー

両方を区別せずに、見逃してしまうOn Error Resume Nextの使用は、
できるだけ避けたほうが良いと思います。
(実際、この場合は、エラーにならないので、(2)に気づかなかったのでしょう)

---------------
まず(2)については、
  Sheet1がアクティブであるときに、
      Sheet2.Range(Cells(1,1),Cells(5,1))
  などと書くことによるエラー。(今回のケースはこれです。)
      Sheet2.Range(Sheet1.Cells(1,1),Sheet1.Cells(5,1))
  と書いているのと同じですから、Excel君が混乱を来すのです。
こうしたものはむしろエラーになるべきなんです。

---------------
次に(1)ですが、
AA = Application.WorksheetFunction.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
ではなく、
AA = Application.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
とすることで、エラーで止まるのを避けることができます。

該当が無い場合には、エラーを示す情報がAAに返りますから、
If IsError(AA) Then などとして、マッチの有無を判定することができます。

詳しくは、例えば、
ht tps://www.moug.net/tech/exvba/0100035.html
をごらんください。
・ツリー全体表示

【78435】Re:Match関数の使い方
お礼  tomi  - 16/9/22(木) 15:15 -

引用なし
パスワード
   ▼γ さん:
>セル内の計算式がどうこうというのは、こちらでは不明です。
>説明が足りませんので。
>それよりもまず、セル範囲を正確に書くことが先決です。
>シートを特定しないセル範囲は、アクティブシートのそれとみなされてしまいます。
>どう書くか、例えば、以下。
>
>Sub test()
>  Dim ws As Worksheet
>  '他の変数の宣言は記載省略しました。きちんと宣言すべきです。
>  
>  For i = 1 To BB
>    Set ws = Workbooks("原料配合表.xlsb").Sheets(i)
>    PL = ws.Range("A1000").End(xlUp).Row
>    On Error Resume Next
>    AA = Application.WorksheetFunction.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
>  Next
>End Sub
ありがとうございました。どのブックのシートをはっきりさせてやってみます。
・ツリー全体表示

【78434】Re:Match関数の使い方
発言  γ  - 16/9/22(木) 14:28 -

引用なし
パスワード
   セル内の計算式がどうこうというのは、こちらでは不明です。
説明が足りませんので。
それよりもまず、セル範囲を正確に書くことが先決です。
シートを特定しないセル範囲は、アクティブシートのそれとみなされてしまいます。
どう書くか、例えば、以下。

Sub test()
  Dim ws As Worksheet
  '他の変数の宣言は記載省略しました。きちんと宣言すべきです。
  
  For i = 1 To BB
    Set ws = Workbooks("原料配合表.xlsb").Sheets(i)
    PL = ws.Range("A1000").End(xlUp).Row
    On Error Resume Next
    AA = Application.WorksheetFunction.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
  Next
End Sub
・ツリー全体表示

【78433】Match関数の使い方
質問  tomi  - 16/9/22(木) 12:00 -

引用なし
パスワード
   よろしくお願いします
For i=1 to BB  
 PL = Workbooks("原料配合表.xlsb").Sheets(i).Range("A1000").End(xlUp).Row
 On Error Resume Next
 AA = Application.WorksheetFunction.Match(ZRK, Workbooks("配合.xlsb").Sheets(i).Range(Cells(3, 6), Cells(PL, 6)), 0)
Next
 Range(Cells(3, 6), Cells(PL, 6))のところに計算式に
 =+A48&" "&B48&" "&C48&" "&D48がはいっているためデータが読み出しが
 できません。計算式がなく入力したものは検出できます。
 上記のMatchのプログラムのどのようになおしたらよいか教えてください。
・ツリー全体表示

【78432】Re:日付時刻の入力判定
お礼  rao  - 16/9/19(月) 8:16 -

引用なし
パスワード
   ありがとうございました。
・ツリー全体表示

【78431】Re:日付時刻の入力判定
発言  γ  - 16/9/19(月) 6:40 -

引用なし
パスワード
   二つにわければ、35:00 といった入力は、
入力規則なり条件付き書式なりで警告を出せます。
それは所詮小数点以下を持つ数値なんだから、
1 以上だったらアウトにすればいい。
・ツリー全体表示

【78430】Re:日付時刻の入力判定
お礼  rao  - 16/9/19(月) 6:24 -

引用なし
パスワード
   確かに、日付と時刻を同じセルに入力するの、
前から面倒だと思っていました。
別セルに入力して、後で結合した方が、ラクですね。

ありがとうございました。
・ツリー全体表示

【78429】Re:日付時刻の入力判定
発言  γ  - 16/9/18(日) 23:55 -

引用なし
パスワード
   >(2)打ち込みミスなので自動変換されてokだされても困るのです。
> 自動変換させずに判定する方法はないでしょうか?

そんなこと言われても私はマイクロソフトの人間じゃないから
自動変換の責任を取らされても困るんですよ。知らんよ、そんなこと。

いったん文字列書式のセルに入力させてから、
マクロで移すんじゃないですか?

でも、深夜残業などで、25時なんていうのを使う会社もありますよ。
それと、日にちと時間を一つのセルに入れるのは、話を難しくするだけだと思います。
実態を踏まえて、全体の構想を良く練ってください。
・ツリー全体表示

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