• 締切済み

excel vba で変数に格納そして取り出し方

参考書、相談室で教えて頂き、何とかなっておりましたが、変数に格納、その数値を取り出すことについて、基本的な事をもう一度基本を教えて頂けませんか。 今,sheet2の、b3セルの数値が変化しています、それをSheet1のb3セルが参照しています。 そのsheet1の参照セルの数値を変数に格納し、それを読み出して使いたいのですが、うまくできません、どのように考えたらいいのですか。現在は、下記コードの、k、の引き数の変化ができなく暗礁に乗り上げております。 set temp = worksheets(("描画").shapes.addTextbox(mosTextboxorientationHorizontal.86,k,66,18) の、,k、の数値を変化させたいのですが出来ません。 sheet1のセルの数値を変化させないで、一つの数値に固定すれば、問題なく目的の描画が行われます。 変数に格納、for....nextで取り出して等いろいろ試みましたが、参照セルが変化すると描画しません。 申し訳ありませんが、もう一度教えて頂けませんか。

  • diwk85
  • お礼率83% (141/168)

みんなの回答

  • -antsu-
  • ベストアンサー率50% (84/168)
回答No.4

#2です。 最初の質問文ではB3セルを参照とありましたが、補足ではQ93セル? 一応、記載のコードで試してみましたが、配置できましたよ。 ちょっと手を加えてますが。 Sub Sample() Dim temp As Shape Dim t, j,k As Long Dim Ws As Worksheet Set Ws = Worksheets("描画") t = Ws.Range("q93") For j = 73 To t Step 1 k = Ws.Cells(j, 17) Set temp = Ws.Shapes.AddTextbox(msoTextOrientationHorizontal, 32, k, 65, 17) Next End Sub 念のため確認ですが…。 1)Q93セルに変数jで飛ばしたい数値が入っていますか? 2)Cells(j, 17)には変数kに入れたい数値が入っていますか? 3)変数t,j,kの型は整数型(LongやInteger)になっていますか?

diwk85
質問者

お礼

ご解答ありがとうございます。 q93には、最大20件のtextoboxを表示のため20件分の表示位置を描画シートq73からq92まで演算入力してあります。(表示件数が変化すれば変化します。)q93には、その件数の合計と定数の73が加算され入力されています。 20件のときはq93は、73+20=93の数値になります。j=73 to 93となり20件分 q73からq93まで使います。 cellsから(j,17)は、20件分の表示位置の、q73~q92までの数値そのものです。 変数の宣言については、特に意識しませんでした。 -------- 私の考え方にまちがいが、あるとおもいました。私がいまできるのは、20件分のtextboxをcells(73,17)~cells( 92,17)すなわちq73~q92の数値にしたがって描画しているのであって、今回の目的は、描画そのものには問題はなく、その引数kの、描画位置の数値をこのコードが実行されると一瞬に変化するj74~j113セルの数値の一部を、引数kに使うというこで、その数値は、j74~j113のすべてではなく、指定した1セルの数値を利用するだけす、このため、たとえば、k≖worksheets("描画").Cells(82,10).valueとすれば指定したセル(この場合j82の数値分の位置に相当する1件分、描画しますが、j73からj113の中の指定した1セルの変化を変数に格納しその変化した数値回数分に対応したコードの記述できていないため変化した分をkに与えようとして、変数を代入しても、1件分も描画しませんので、変化する条件を変数に格納することとその変数から取り出してkに出力することの基本が全然できていないのだとおもいます。 -------- ご解答いただいたコードを取り急ぎ試みましたが、目的が達成できませんでした。もう一度試みてみたいと思います。変化する条件を利用する点だけが変わっただけですので、何とか解決したいと思います、何度も試みたいとおもいます。 ほんとに、ありがとうございました。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

http://billyboy.blog81.fc2.com/blog-entry-224.html こんなかんじで worksheet_changeに その関数を書いてみるといいかも?

  • -antsu-
  • ベストアンサー率50% (84/168)
回答No.2

記載されているVBAのコードだけでは、変数kを含めた流れがよくわかりません。 変化といっても、VBA上で行うものなのか手入力や関数などによるものかもわかりません。 もう少し詳細に記載された方がいいと思いますよ。

diwk85
質問者

お礼

すみません、余分な事を書くとかえって説明がややこしくなると思いました。 実は、テキストボックスの表示位置を変化させる目的の質問です。 dim temp as shape t = worksheets("描画")range("q93").value for j = 73 to t step 1 k = worksheets("描画").cells(j,17).value set temp = worksheets("描画").shapes.addtextbox(msotextorientationHorizontal,32,k,65,17) このコードの、引数kの数値を変化させて、textboxの描画位置を変化させたいのです。 変化する数値は、ワークシート関数を使い別なsheetで演算し(コードを実行させると一瞬にして数十件の演算処理します。その変化を、描画sheet上のセルが参照しています(直接、演算シートのセルを参照してもいいかもしれませんが)。そのセルの変化を変数に格納しそれを使い、kの数値を変化した回数分だけ変化させたいのです。 現在、描画することについては、問題なくできますが、描画位置を、参照したセルの数値にしたがって変化させることができないでしょうか。描画後の状態は、数十個のtextboxが描画された状態になればいいのですが。 説明がうまくできませんが。よろしくお願いします。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

Sheet1のB3セルが変化したことをトリガーにして 関数を実行しなおせばいいと思うわ 今の状態は恐らく Excelファイルを開いた後、最初に関数が実行されたときの Sheet1のB3セルの値を参照して描画を行っているんだと思うの なので、Sheet1のB3セルの値が変わったっときに 取得しなおしていないから そうなるんじゃないかしら?

diwk85
質問者

お礼

早速のご解答ありがとうございます。 ご指摘の通りたしかに、一番初めの数値に対する動作のみの様にも思えますが(固定に入力した数値に対しては描画します)が数値を変化させると、全然描画しません。 なお,sheet1のb3セルの値が変わった時に取得し直す、とのことですが,vbaをやり始めたばかりで、ご指導の内容の取扱が残念ですが難しいです。 今の変数に格納の仕方は、例えば A = worksheets(”描画”).range("b3").value として、その、変数A、を使い、引数kの数値をsheet1の変化した回数分の数値の変化をkに反映させたいのです。 やはり、ちょっと難しいのかもと思います。 まずはお礼の返信まで。ありがとうございます。

関連するQ&A

  • エクセルVBA ユーザー定義の値を変数に格納したい

    Excel2003を使っています。 ユーザ定義を使ってセルへの入力をします。 例えば、 セルB1に AB1111 セルC1に AB2222 セルD1に AB3333 セルE1に AB4444 セルF1に AB5555 と入力します。 4桁の数字の前に"AB"が決まって付くので、ユーザー定義 "AB"##0000 を使って数字4桁だけ入力するようにしました。 そしてさらに、 エクセルVBAを使って、変数iに AB1111 を格納したいのですが、iには 1111 しか取得できません。 iに AB1111 を取得したいのですが、どなたか方法を教えてください。 よろしくお願いします。

  • [マクロ]配列を区切り文字で変数に格納する方法

    タイトルの通りなのですが、 例えば、 A1~B10にランダムな数字が入っています。 (1)A1~B10を配列Cに格納します。 (2)配列C(1,10)を変数test1に格納します。  ※その時に各配列を/で区切る (3)配列C(2,20)を変数test2に格納します。  ※その時に各配列を/で区切る (4)test1をセルC1に記入 (5)test2をセルC1に記入 のような感じです。 配列に格納する方法はさすがに分かるのですが、区切り文字を入れて変数に格納する方法が分かりません。。。。 ご教授お願いいたします。

  • エクセル上のVBA

    当方、VBAまるっきり初心者です(触りはじめて3日くらい)。 エクセルはある程度理解しているつもりですが… バージョンはエクセル2000です。 他シートのセルのひとつに入力すれば、 別シートのセルがそれを参照したうえで 値として表示出来るようにならないでしょうか。  今のところ、以下のような状況です。 step01 sheet1のセルA1に任意の数値(整数限定です)を入力。 step02 sheet2のセルA1に、sheet1のセルA1の数値を用いて     MOD関数で余りを出す。 step03 sheet2のセルB2に以下のVBAによって     step02の余りを値として表示。      Private Sub Worksheet_Change(ByVal Target As Range)        Range("b2").Value = Range("a1")      End Sub  これだとsheet1の数字を変えても、 sheetの切替後sheet2のセルB2に 表示される値が変わってくれません。  最初の入力(step01の入力)をおこなえば sheet2のセルB2まで値が変わってくれるような方法を 教えていただけないでしょうか。  拙い説明で申し訳ありませんが、よろしくお願いします。

  • EXCEL VBAでできますか?

    皆様おはようございます。時々質問させていただきよい回答を得られまして 感謝しております。今回質問させていただきたいのは質問する僕のほうでもうまく説明できるかどうかわかりませんが・・・・ EXCELのSheet1のセルA1に数値205があります。右隣のSheet2にB2から下にかけて205、206、205、199、197と数値があります。 このSheet1の数値205と同じ値をSheet2から選択してそのセルの番地を Sheet1のD1から下に表示するという方法はありますでしょうか? この設問でいうとSheet1のD1、D2にSheet2のB2、Sheet2のB3と表示される と思うのですが・・・ どうか回答をよろしくお願いいたします。

  • エクセルVBA 変数Aと変数Bの組み合わせに対応する値を返すコード

    ワークシート上に次の表があり,この表をもとにして,変数A(0~4)と変数B(0~4)の組み合わせに対応するC列の値を返すコードは,どう書いたらよいでしょうか。  例えば,変数Aのセルに●(4),変数Bのセルに▲(0)と入力したら,値のセルに■(5)と表示させたいのです。  どなたか教えていただけませんか。 A列  B列  C列  4   0   5  3   1   4  3   0   5  2   2   3  2   1   4  2   0   4  1   3   2  1   2   2  1   1   3  1   0   3  0   4   1  0   3   1  0   2   2  0   1   3  0   0   3 変数A:● 変数B:▲ 値:■

  • Excel VBA 値取得について

    お世話になります。 どなたかお力をお貸しください。 Excel2003 VBAでプログラムを組んでおり、エクセルのシートをデータベース代わりに利用しています。 複数のブック散乱している10万個近くのテキストボックスの値を、 「A」というブックの「シート1」のセルに格納して行きたいと思っております。 値の格納方法としては、「A」ブックの「シート1」の セルA1からA2、A3…A列最終行(6万強)まで縦の並びにデータを格納していきます。 ただし、「シート1」に格納したい値は10万個近くあるので、 A列だけでは足りなくなります。 A列の最終行まで値を格納し終えたら、自動的にB列に移動して、 セルB1からB2、B3…B列最終行(6万強)という遷移させていきたいのです。 A列のみに格納していくのであれば、理解できるのですが、 自動遷移がわかりません。 For i = 0 To 最終行(6万強) シート1.Range("A" & i) = 参照元 Next i よろしくお願いします。

  • エクセルVBAでの変数のスコープ

    基本的なことなのですが、教えて下さい。 当方、PHPやjavascriptを中心にプログラムしてきたのですが、 今回、エクセル+VBAでプログラムすることになり、VBAを勉強しているところなのですが、ちょっと戸惑っています。 いままでは、グローバル変数をなるべく使わないように、プログラミングをしてきたのですが、 VBAの勉強で、参考にしている本のコードは、全てグローバル変数を使っています。 そもそも、エクセルのシート・セルがグローバル変数のようなもの(?)なので、変数のスコープにこだわってもあまり意味がないのかな?とも思います。 エクセル+VBAである程度の規模のプログラムを作る際、 変数のスコープはどのように使い分けるのが良いのでしょうか? すみませんが、ご教授の程、よろしくお願いします。

  • エクセル 数式について

    皆さんこんにちわ。 現在エクセルで計算式を作らせようとしているのですが、 わからない事があったので質問させて下さい。 メインシート(シート1) A1セルに入力欄(数値記入)  B1セルにA1セルから出した結果  C1セルには別シートの対応した列の数値÷B1セルに入力した数値 別シート内容(シート2) A1 1 B1 20000 A2 2 B2 40000 A3 3 B3 60000 例で書くと シート1のA1セルに2 シート1のB1セルに2000  と書いてるとして シート1のC1セルには   「A1には2と入っているのでシート2の2って表示されている列のB2セルの40000÷B1セルの2000」の答えを表示させたいです。 ここでわからないのが別シートからの参照方法とその列の入力した数字の列のBセルの参照 方法です。(その行で2と言う数値がある列の別セルを参照させる) 少しわかりずらいのですが、上記に書いた事のやり方 どんな風にしたらいいのか、詳しい方ご助言下さいm(__)m

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • 何時間後の時間を変数に格納する方法

    エクセル2003を使用しています。 今回、以下の問をといた後、最後の一工夫が、できなくて困っております。 問:ある物xを、【2010/3/7 10:00】に購入しました。 ある物xは、1時間単位で5%値上がりします。 次回購入予定日【2010/3/8 11:30】には、前回購入日より何%高くなっていますか? また、分は切り捨てて考えるものとします。(差:2時間20分→2時間) <やったこと> 1.ある物を購入した日をA1セルに入力する。 (【2010/3/7 10:00 書式:yyyy/m/d hh:mm】を入力しました。) 2.A2セルに未来購入予定を入力する。 (【2010/3/8 11:30 書式:yyyy/m/d hh:mm】を入力しました。) 3.A3セルに、数式:【=FLOOR(A2-A1,TIME(1,0,0))】 書式:[h] を指定しました。 →結果は、25とでております。(25時間が出たものと思われます。) 4.A4セルに、数式:A3*5 と入力し、125が出ました。書式:[h] 以上の手順により、125%物が高くなっているということがエクセルで出せたのですが、 手順3で導いた【25時間後】の【25】を数値として、VBAの変数に取り込みたいのです。 以下のコードを書いてみたのですが、1という数値が変数に格納され、25が入りません。 コード:temp = Cells(3, 1).Value (A3セルには、25と見た目上はでています。  ですが、シリアル値は、1.0416…と表示されており、  変数には、整数部分の1が格納されているようなのです。  書式を【標準】に変えて確認しました。) どなたか、この25時間後の【25】というものを、変数に格納する方法がわかるかたがいらっしゃいましたらご教授お願いします。

専門家に質問してみよう