エクセルVBAで複雑な処理を行う方法

このQ&Aのポイント
  • エクセルVBAで複雑な処理を行う方法についてご質問です。
  • エクセルVBAを使用して特定のセルをダブルクリックすると他のシートやセルに値を表示する方法について教えてください。
  • エクセルVBA初心者が複雑な処理を実装する際に参考になる書籍や学習方法についてアドバイスをいただきたいです。
回答を見る
  • ベストアンサー

エクセルVBAで出来ますか??

はじめまして。 私の質問を読んで下さりありがとうございます。 上司にエクセルで少々複雑な?仕組みを作るように指示されたのですが、私自身はエクセルに詳しくはなく、社内にも詳しい人がいなくて困っています。 「Excel VBA パーフェクトマスター」という本を購入して勉強を始めたのですが、あまりに情報が多すぎてどこを参考にすればよいのかすら分かりません・・・。 来週末までに作らないといけないため休日返上でお仕事しながら勉強していますが、さっぱり分からなくて泣きそうです・・。 エクセルVBAに詳しくて親切な方がいらっしゃいましたら、無理のない範囲で構いませんので、どうか教えて頂けないでしょうか。宜しくお願い致します。 前置きが長くなってしまいましたが、具体的には以下のような処理はどうすれば良いのかが分かりません。 (1) 「Sheet1」のセル[A2]をダブルクリックすると「Sheet3」が表示される。 (2) 「Sheet3」のセル[D5]をダブルクリックすると「Sheet2」のセル[C2]の値(文字か数字)が「Sheet1」のセル[A2]と「Sheet4」のセル[B5]に表示され、更に「Sheet5」のセル[F10]の数値が「Sheet1」のセル[N5]に表示される。 (3) 上記の一連の処理が完了すると「Sheet1」が表示される。(「Sheet1の画面に戻る) 以上のような処理を複数組み合わせればできそうなのですが、このような事はエクセルVBAで出来るでしょうか? (私には出来るのか出来ないのかすら分かりません。命令した上司も分かってないと思います。) 出来るか出来ないかだけでも結構なので、どうか教えてください。 もし可能なら、具体的なアドバイスを頂けると、とても助かります。 どうか宜しくお願い致します。

noname#151222
noname#151222

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんにちは! 細かい部分(セル表示)等で間違いがあるかもしれませんが・・・ 質問内容を粛々とコードにしてみました。 すでに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

noname#151222
質問者

お礼

日曜日なのにご親切にありがとうございました! 教えていただいたコードそのままで、実現したかったことが簡単にできました! 本当に嬉しいです! これで何とか来週末までには出来そうです! 不安で不安で本当に困っていました。心から感謝致します! ありがとうございました!

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

既に回答は出ているでようだが >「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の記事を活用するほかないだろう。 とりあえずは「吸収期」にあることを自覚して、時間をかけて、多くの用例に当たることだと思う。 本当は仕事に使うものなら、金をかけて、プロに頼めといいたい。ソフトだから、勉強だけで、ただで出来るというのはおかしいと思う。

noname#151222
質問者

お礼

具体的なコードと考え方まで教えてくださり、ありがとうございました! ご指摘は全くその通りだと私も思いますが、小さな会社で予算もなく、今いる社員で何とかしなければならない事情もあってこうなっています。 私みたいななんちゃって事務員にできる仕事ではないかも知れないですが、泣きごとは言えないので(少し泣いちゃいましたけど・・)、今回皆様に教えて頂いた事を参考に頑張ってみたいと思います。 ありがとうございました!

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.5

もちろん、こんなのは簡単にできますよ。但し 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を活用すると良いですよ。

noname#151222
質問者

お礼

具体的なコードとアドバイス、本当にありがとうございます! なんとかなりそうです! アドバイスしていただいたことを参考に色々試してみたいと思います。 ご親切に心から感謝致します!

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.2です! たびたびごめんなさい。 前回書き忘れたのですが、Sheet名を入力する手間を省いたため コード内の  > Worksheets(3) などの部分の括弧内がSheet番号になります。 どんなSheet名になっていても構わないのですが、Sheet見出しの順番になりますので、 必ずSheet見出しでは左から1~5の順にしてください。 何度も失礼しました。m(_ _)m

noname#151222
質問者

お礼

補足説明ありがとうございます! アドバイスにしたがって気をつけて作ります。 ありがとうございました!

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.3

可能です。 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 以上で、ほぼ実現可能です。 頑張ってください。

noname#151222
質問者

お礼

覚えればよいところを教えてくださり、ありがとうございます! 早速勉強させていただきます! どこを学べばよいのかすら分からなかったので、とても助かります。 本当にありがとうございました!

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

マクロを使って対応することができます。 例えば次のようにします。 シート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 以上で完成です。

noname#151222
質問者

お礼

具体的に丁寧に教えてくださりありがとうございます! 嬉しいです! 「Sheet3」の画面でセルを選ばないといけないので今の作業ではそのまま使えないみたいですが、一瞬で必要項目に入力できたのでビックリしました。スゴイです!  今のとは別件の処理でそのまま使うことができそうです。 本当にありがとうございました!

関連するQ&A

  • エクセル VBA

    エクセル VBA セルA1に ”□はい □いいえ”とあり それをダブルクリックすると ?フォームが表示されチェックしますか?と聞きOKなら ■ はい となり   次に続けて ?フォームが表示されチェックしますか?と聞きOKなら ■いいえ となるような マクロの記述は出来るのでしょうか? すいません! 教えてください。

  • Excel 2010 VBAで教えてください。

    Excel 2010 VBAで教えてください。 Doubleの配列 Dim A(100) as double に ワークシート "Sheet1" セル A1:A100 の値を一発(For loop等を利用しない) で読み込むにはどうすればよいのでしょうか。 同じく、 Doubleの配列 A(100)を ワークシート "Sheet2" セル B1:B100 に一発で書き出すのはどうすればよいのでしょうか。  Variantにて Dim A as Variant では  A = Sheets("Sheet1").Range("A1:A100") で 読み込めました。 また Sheets("Sheet2").Range("B1:B100")で書き込みできましたが、double等でどうすれば良いのか知りたいです。

  • Excel 2007 VBAについて質問します。

    Excel VBAの初心者です。 行の非表示と表示についてお聞きしたいのです。 ExcelのSheet1の1行目(1行全体)のみを、シート上のセルをWクリックをして 非表示にしたり表示させたりするのには、どの様なコードを書いたらいいでしょうか? VBA初心者の為、分かりやすい回答をお願いします。

  • EXCEL VBAを利用して別ウィンドウでブックを起動する

    エクセルファイル(A.xls)内のセル($A$1)をダブルクリックすることで、エクセルファイル(B.xls)のワークシート(1)を開くVBAを作成しています。 ここまでは出来たのですが、1つ問題があります。 上記VBAでは、A.xls と B.xls が1つのエクセルファイルとして開かれてしまいます。(表現が誤っていれば申し訳ないです) どういうことかと言いますと、A.xlsもしくは、B.xlsのどちらかを閉じると両方閉じてしまいます。また、A.xlsとB.xlsを画面上に並べて比較することができず、画面下のタブを切り替えてそれぞれのファイルを見なければなりません。 例えば、スタート→プログラム→MicroSoftOffice→EXCELを2回行えば、エクセルファイルが別ウィンドウでそれぞれ独立して立ち上がります。要は、A.xlsのセル($A$1)をダブルクリックした時にB.xlsはこのような状態で立ち上がってきて欲しいのです。 以下、作成途中のVBAコードの一部です。A.xlsのセル($A$1)をダブルクリックすると、独立したエクセルを開くことはできました。 Dim OP As Double   OP = Shell("EXCEL.EXE", vbMaximizedFocus) しかし、B.xlsのワークシート(1)はA.xlsと1つのファイルとして開かれてしまいます。 (例:A.xlsのセル($A$1)をダブルクリックすると、B.xlsと新規EXCELファイルの全部で3つの状態になります。) 目標は、A.xlsのセル($A$1)をダブルクリックすれば、B.xlsのワークシート(1)が開く。 A.xlsのセル($B$2)をダブルクリックすれば、B.xlsのワークシート(2)が開くです。 長くなりましたが、どうかご助言よろしくお願い致します。 【作成途中VBAコード】 Private Sub Worksheet_BeforeDoubleClick(ByVal target As Range, Cancel As Boolean) Dim OP As Double    Dim Bfile As String Bfile = target.Address Select Case Bfile Case "$A$1" OP = Shell("EXCEL.EXE", vbMaximizedFocus) Workbooks.Open ("C:\B.xls") Worksheets("ワークシート(1)").Activate Case Else End Select End Sub

  • エクセル VBA BeforeDoubleClick

    エクセル VBA 初心者です エクセルで セルをダブルクリック(複数のセル)しUserFORMが出るところまではできましたが UserFormでの登録時のオブジェクトがわかりません;;  sheetでtarget.range("A1:G1")して A1~G1でUserFormをよびだしています UserFormで登録時 target.offset(1,0)=textbox1.text みたいな感じで作ったらオブジェクトが見つかりませんが でます userformでのtarget指定はできるでしょうか?

  • エクセルVBAについて質問です。VBAを初めて1カ月くらいなので、簡単

    エクセルVBAについて質問です。VBAを初めて1カ月くらいなので、簡単な質問かもしれませんが、よろしくお願いします。 Cells(1, 1).Value = "'1/" + TextBox1.Value 上のコードの"'1/"の部分で質問なのですが、例えばTextBox1.Value=2の場合、セルA1には「1/2」と表示されます。そしてこの「1/2」を数式として扱おうとするとエラー(#VALUE!)になります。その原因はセルA1をクリックすると、メニューとシートの間にある「fx」の右側の部分に「'1/2」と表示されているからだと思うのですが…。 これを数式として扱う何か良い方法はありませんか?シートを扱って解決するのではなくVBAを扱って解決したいのですが…。

  • エクセルとVBA

    こんにちは。 エクセル勉強中です。 今、エクセル2007で下の画像のような、売上と支店別 のシートを作成しました。 A2セルからA9に売上金額が入力されており、B2セルからB9 セルに支店名が入力されています。 A10セルとB10セルは合計額です。 ここでしたい処理なのですが、それぞれ支店別に 金額を合計して、画像の右のようなメッセージボックスを VBAで出すコードなんてあるのでしょうか。 今は目視で計算しているので大変です。 よろしくお願いします。

  • Excel VBAについて

    VBA初心者です。 社内の様式に合うようなVBAを組みたいのですが。。。 1,様式は表になっており1つのグループに5つの選択肢があり横に5グループ,縦に12グループあります。(例えば1行目にA1.A2.A3.A4.A5|B1.B2.B3.・・・・E3.E4.E5 2行目にF1.F2.F3.F4.F5|G1.G2・・・・12行目にBM1.BM2のような表) 2,シートは2枚あり1枚目のシートで選んだ1グループ1項目に1つだけ○がつく(ダブルクリックで選択し,違う項目を選択すれば前に選んだ項目の○は消える。) 3,1枚目に丸がついた項目が2枚目の任意のセルに表示される(例えば1枚目のシートのAグループのA3を選択すれば2枚目のシートの任意のセルにA3と表示され,取り消し変更された場合は変更後の選択肢のみ表示される) 4,また,選択する項目は変更されないように保護をかけたい。

  • エクセル上の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 vba 初心者です。office2003使用しています。 コードの書き方が分からないのでご教授していただけないでしょうか? やりたいことは、 セルのC5をダブルクリックしたときに、カレンダーコントロールを表示させ、カレンダーの日付をクリックした時にその日付をC5へ渡しカレンダーコントロールを閉じたいです。 よろしくお願いいたします。

専門家に質問してみよう