- ベストアンサー
エクセルVBAで複雑な処理を行う方法
- エクセルVBAで複雑な処理を行う方法についてご質問です。
- エクセルVBAを使用して特定のセルをダブルクリックすると他のシートやセルに値を表示する方法について教えてください。
- エクセルVBA初心者が複雑な処理を実装する際に参考になる書籍や学習方法についてアドバイスをいただきたいです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは! 細かい部分(セル表示)等で間違いがあるかもしれませんが・・・ 質問内容を粛々とコードにしてみました。 すでにSheetはSheet1~Sheet5まで入力してあるとして、 画面左下のシート見出しの「Sheet1」の部分で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストし、Sheet1のA2セルをダブルクリック Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target = Range("A2") Then Cancel = True Worksheets(3).Activate End If End Sub 次にシート見出し「Sheet3」の部分で右クリック → コードの表示・・・(上記と同様)・・・ Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target = Range("D5") Then Cancel = True Worksheets(1).Range("A2") = Worksheets(2).Range("C2") Worksheets(4).Range("B5") = Worksheets(2).Range("C2") Worksheets(1).Range("N5") = Worksheets(5).Range("F10") Worksheets(1).Activate End If End Sub としてSheet3のD5セルをダブルクリックしてみてください。 こんな感じではどうでしょうかね? ※ ご希望通りの動きにならなかったらごめんなさいね。m(_ _)m
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17069)
既に回答は出ているでようだが >「Sheet1」のセル[A2]をダブルクリックすると「Sheet3」が表示される Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Address = "$A$2" Then Sheets("Sheet3").Select End If End Sub これに必要な学ぶべき課題は ・シートのイベントというものの考え方 ・イベントのどれを使うか ・そのイベントが決ったセルで発生したことのとらえ方 ・Sheet3を表示するというコード。シートの特定の仕方。 など。 「イベント」(仕組み)という考えは、VBAでも中級以上の課題(VBAの初級の本の前半には出てこないだろう)と思うが、素人が考える課題としては、むしろ、まづやりたい課題で、その辺にギャップがある個所。 ーー 普通VBAの本を数回読んだぐらいでは、上記のような個別課題(上記で箇条書きにした課題」)に整理されても、どうして良いのか(本の何処に載っているのか)判らないのが常でしょう。 そのほかにこの質問(複雑な課題ではないので)には出てないが、処理ロジックというものが、課題を解決するには必要で、それは本にズバリは書いてないことが多く、経験を積んで会得しないとならない。 私の経験から、回りに聞く人がいなくて、本で独学するのは至難のことと思う。 しかし現に世の中にその難点を突破する人も沢山居る。プログラム的なことが好きで集中できる凝り性である必要があるのかも。 >「Sheet3」のセル[D5]をダブルクリックすると「Sheet2」のセル[C2]の値(文字か数字)が Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Address = "$D$5" Then x = Sheets("Sheet2").Range("C2") MsgBox x End If End Sub このXの値を >Sheet1」のセル[A2]と「Sheet4」のセル[B5]に表示され、を行う。 「表示され」というより、「入力する」というべきだろう。私は「値をセットする」を使っている。 尚シートのイベントはシート別にいれるもの。 ですから各シートタブで右クリックし、コードの表示でコードを入れる画面を出し オブジェクト(Worksheetなど)を指定し、そのオブジェクトで使える意面とを選ぶ仕組みだ。 すると Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) End Sub が出てくる。そして Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Address = "$D$5" Then x = Sheets("Sheet2").Range("C2") MsgBox x Worksheets("Sheet1").Range("A2") = x Worksheets("Sheet4").Range("B5") = x End If End Sub 以下は長くなるので略す。 私はVBAに興味を持て15年ぐらいになるが、殻が破れず、まだ不得手な分野はいっぱい在る。 勉強し始めて1,2ヶ月ぐらいで、色々判らないと騒ぐのは、当たり前すぎると思う。VBAを甘く見るなといいたい。 本当はスクールにでも通って、早くまとまった、勉強をしたほうが良いのは良い(仕事に使うなら、むしろ必須といいたい)。 ほかにWEBの記事が充実してきているので、VBAのWEBの記事を活用するほかないだろう。 とりあえずは「吸収期」にあることを自覚して、時間をかけて、多くの用例に当たることだと思う。 本当は仕事に使うものなら、金をかけて、プロに頼めといいたい。ソフトだから、勉強だけで、ただで出来るというのはおかしいと思う。
お礼
具体的なコードと考え方まで教えてくださり、ありがとうございました! ご指摘は全くその通りだと私も思いますが、小さな会社で予算もなく、今いる社員で何とかしなければならない事情もあってこうなっています。 私みたいななんちゃって事務員にできる仕事ではないかも知れないですが、泣きごとは言えないので(少し泣いちゃいましたけど・・)、今回皆様に教えて頂いた事を参考に頑張ってみたいと思います。 ありがとうございました!
- hallo-2007
- ベストアンサー率41% (888/2115)
もちろん、こんなのは簡単にできますよ。但し 1) 「Sheet1」のセル[A2]をダブルクリックすると・・・ 2) 「Sheet3」のセル[D5]をダブルクリックすると・・・ 3) 上記の一連の処理が完了すると・・・・・ ですが、いったん 2)のダブルクリックする作業が発生していますので一連の処理 というのが不可能???ですね。 やりたいことを 1)シート1 上に ボタンを配置して そのボタンをクリックすると 「Sheet2」のセル[C2]の値を「Sheet1」のセル[A2]と「Sheet4」のセル[B5]に入り 「Sheet5」のセル[F10]の数値が「Sheet1」のセル[N5]に入る といった作業を自動化した方が良いのではないのかなと思いますが。 如何でしょうか。 ボタンの作成、マクロの登録については 本の最初の方に出ていると覆います。 Sub ボタン1_Click() Sheets("Sheet1").Range("A2").Value = Sheets("Sheet2").Range("C2").Value Sheets("Sheet4").Range("B5").Value = Sheets("Sheet2").Range("C2").Value Sheets("Sheet1").Range("N5").Value = Sheets("Sheet5").Range("F10").Value End Sub まずは、ここまでは大丈夫でしょうか。 しかし、Sheet1にボタンがあって、新しく数値などを入力の作業をするシートがSheet2 Sheet5で あったら、いちいちシートを移動しなくてはならないので不便ですよね。そこで 入力作業専用のシートを準備して、ボタンを配置します。仮に B2セルとC2セルに 値や数値をいれて ボタンを押すと 入力作業専用シートの B2セルの値が 「Sheet2」のセル[C2]と「Sheet1」のセル[A2]と「Sheet4」のセル[B5]に入り、更に 入力作業専用シートの C2セルの値が「Sheet5」のセル[F10]と「Sheet1」のセル[N5]に表示される。 様なVBAを考えると、作業自体が簡単になるはずです。 シートの構成や日頃の作業や目的なども考慮してVBAを活用すると良いですよ。
お礼
具体的なコードとアドバイス、本当にありがとうございます! なんとかなりそうです! アドバイスしていただいたことを参考に色々試してみたいと思います。 ご親切に心から感謝致します!
- tom04
- ベストアンサー率49% (2537/5117)
No.2です! たびたびごめんなさい。 前回書き忘れたのですが、Sheet名を入力する手間を省いたため コード内の > Worksheets(3) などの部分の括弧内がSheet番号になります。 どんなSheet名になっていても構わないのですが、Sheet見出しの順番になりますので、 必ずSheet見出しでは左から1~5の順にしてください。 何度も失礼しました。m(_ _)m
お礼
補足説明ありがとうございます! アドバイスにしたがって気をつけて作ります。 ありがとうございました!
- kokorone
- ベストアンサー率38% (417/1093)
可能です。 1)セルをダブルクリックした時、VBAを実行する。 http://pintxos.blog.bai.ne.jp/?eid=84835 質問では、シート1、シート3でダブルクリックの処理があるので、それぞれのシートのマクロに登録 しなければなりません。 どのセルがダブルクリックされたかを判断する必要があります。 上記サイトの例ではA1でしたが、 Rowは行数、Column は列です。 2) シートの表示を切り替える http://officetanaka.net/excel/vba/sheet/sheet01.htm 3)他のシートのセルを参照して、指定したセルに設定 http://officetanaka.net/excel/vba/sheet/sheet01.htm 以上で、ほぼ実現可能です。 頑張ってください。
お礼
覚えればよいところを教えてくださり、ありがとうございます! 早速勉強させていただきます! どこを学べばよいのかすら分からなかったので、とても助かります。 本当にありがとうございました!
- KURUMITO
- ベストアンサー率42% (1835/4283)
マクロを使って対応することができます。 例えば次のようにします。 シート1を表示している状態でシート見出しでSheet1を右クリックして「コードの表示」を選択します。 表示の画面の右側の画面には次のコードを入力します。 Private Sub WorkSheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target = Range("A2") Then Worksheets("Sheet3").Activate End If Cancel = True End Sub 次に同じようにしてシート見出しでSheet3を右クリックして「コードの表示」を選択します。 同様に次のコードを入力します。 Private Sub WorkSheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target = Range("D5") Then Worksheets("Sheet1").Range("A2") = Worksheets("Sheet2").Range("C2").Value Worksheets("Sheet4").Range("B5") = Worksheets("Sheet2").Range("C2").Value Worksheets("Sheet1").Range("N5") = Worksheets("Sheet5").Range("F10").Value End If Worksheets("Sheet1").Activate Cancel = True End Sub 以上で完成です。
お礼
具体的に丁寧に教えてくださりありがとうございます! 嬉しいです! 「Sheet3」の画面でセルを選ばないといけないので今の作業ではそのまま使えないみたいですが、一瞬で必要項目に入力できたのでビックリしました。スゴイです! 今のとは別件の処理でそのまま使うことができそうです。 本当にありがとうございました!
お礼
日曜日なのにご親切にありがとうございました! 教えていただいたコードそのままで、実現したかったことが簡単にできました! 本当に嬉しいです! これで何とか来週末までには出来そうです! 不安で不安で本当に困っていました。心から感謝致します! ありがとうございました!