• 締切済み

VBAの構文を教えてください。

エクセルVBAについて教えてください。 現在、Excelデータを使って注文書の管理をしています。 1.注文書という名前のフォルダ  (1)注文No.の名前でBOOK名を付け、注文をした詳細Excelデータを作成。※No.ごとの名前でExcelデータBOOKを作成しています。なのでかなりのBOOK数があります。  (2) (1)で作成したデータはかなりのBOOK数なので、「注文書インデックス」という名前のExcelデータBOOKをつくり、注文したNo.順で一覧表に簡易詳細を入力したデータを入力。一覧のNo.と一致するBOOKにハイパーリンクを貼り付けてダブルクリックするとそのNo.のBOOKを開けるという作業を行っています。 ハイパーリンク貼り付けをやめて、VBAで行うにはどのような構文になるのでしょうか? VBAの知識をお持ちの方!教えてください。お願いします。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 これは、単なる私のアイデアですが、 適当な場所に、 C:\Documents and Settings\UserName\My Documents\Excel\ まだ、他にあるなら、 C:\Documents and Settings\UserName\My Documents\ と、セルに書いておき、 まず、挿入-名前-登録で、それぞれを、 MyDocEx MyDoc と登録して、 以下のマクロでは、4列目(D列)に、 =MyDocEx とすると、それらの登録したものが出てきます。 (VBE画面で登録する場合もありますが、変更があったときに、そこに書き込まなくてはなりませんから、ちょっと面倒だと思いました。) 今回は、以下のようにして、.xls がついていない場合は、.xls を付けるようにしました。 つまり、.csv などの場合は、.csv と付けてあれば、.xls は付きません。 D列でなくて、もう少し、離れたところで、列を隠しておけば、見られません。 なお、今回は、D列にパス名がついていない場合は、Excelの設定されているデフォルトのフォルダを探すように作ってあります。 すでに開いていた場合は、メッセージが出て、単にアクティベートするだけになっています。そうしないと、変更し保存していない場合に不都合があったような気がします。ただ、そのオプションは、妙に反応が遅いときがあります。 十分にテストしてから、実践でお使いくださるようにお願いします。 気持ち的には、もう少し、レイアウト的にも、マクロの内容も洗練させてあげられるとよいのですが、今のところは、私個人の負担が多くなりますので、このぐらいにさせてください。 なお、参考にはならないと思いますが、このマクロの同様の内容のものが、未だ進行中です。現在、アドイン化に変更中です。ここで書くのでは、初めての大作で、ややこしい内容です。その質問者さんは、特別な事情のある方です。 http://oshiete1.goo.ne.jp/kotaeru.php3?qid=2899966 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim FileName As String Dim myPath As String Dim OrgName As String Dim i As Integer Dim dummy As Variant Cancel = True If Target.Column <> 2 Then Exit Sub 'ファイル名は、2列目に書く If IsEmpty(Target) Then Exit Sub If InStr(1, Target.Value, ".xls", vbTextCompare) = 0 Then   FileName = Target.Value & ".xls" Else   FileName = Target.Value End If If Target.Offset(, 2).Value <> "" Then 'パスは、4列目 (2列目 + 2)   myPath = Target.Offset(, 2).Value   If Right(myPath, 1) <> "\" Then myPath = myPath & "\"   FileName = myPath & FileName Else  'ない場合は、設定されたデフォルトファイルパスになります。   FileName = Application.DefaultFilePath & "\" & FileName End If If Dir(FileName) = "" Then MsgBox FileName & vbCrLf & "ファイルが見つかりません。": Exit Sub  'すでに開いていた場合を探す。  On Error Resume Next   i = InStrRev(FileName, "\")   If i > 0 Then    OrgName = Mid$(FileName, i + 1) '元ファイル名を出す   Else    OrgName = FileName   End If   dummy = Workbooks(OrgName).Worksheets(1).Cells(1, 1).Value   If Err.Number = 0 Then    Workbooks(OrgName).Activate  '←ここが遅いようです。    MsgBox "すでにブックは開いています", vbInformation: Exit Sub   End If   Err.Clear  On Error GoTo 0  On Error Resume Next   Workbooks.Open (FileName)  If Err.Number > 0 Then   MsgBox Err.Number & " : " & Err.Description   Err.Clear  End If  On Error GoTo 0 End Sub

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >ハイパーリンク貼り付けをやめて、VBAで行うにはどのような構文になるのでしょうか? #1さんの、Excel+VBAがなんちゃってなのかというよりも、それは、技術力の問題です。Excelで作るものは、どうしてもVBA中心になって、VBAで作りこんでいくものだから、もし、システムとしたら、こうした掲示板では公開しにくいです。ある程度、質問者さん側にVBAの知識や技術がないと、システムとしては、ごちゃごちゃになって、さっぱり分からなくなってしまうと思うのです。 私のはインターネット・ブラウザのIEで開きますが、ハイパーリンクをやめてダブルクリックであけるように出来ています。おそらくは、ご質問者さんのイメージに近いような気がします。技術的にも、ハイパーリンクは、ハイパーリンクオブジェクトとして存在してしまうので、扱いが面倒なのです。見栄えも悪いです。 一応、サンプル程度ですが、ハイパーリンクの代わりに、イベントドリブン型のプロシージャを使います。 シートモジュールに書き込みます。シートの下のシートタブを右クリックして、「コードの表示」で開く場所です。 ファイルリストは、以下では、2列目(B列)ということにしてあります。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column <> 2 Then Exit Sub 'ファイル名は、2列目に書く If IsEmpty(Target) Then Exit Sub If InStr(1, Target.Value, ".xls", vbTextCompare) = 0 And _   InStr(1, Target.Value, ".csv", vbTextCompare) = 0 Then Exit Sub If Dir(Target.Value) = "" Then Exit Sub  Cancel = True  On Error GoTo ErrHandler   Workbooks.Open (Target.Value) ErrHandler:  If Err.Number > 0 Then   MsgBox Err.Number & " : " & Err.Description  End If End Sub ただ、以下のようなフルファイルネームは、本来は、別の場所に書いておいて、列を隠しておいて、 C:\Documents and Settings\UserName\My Documents\Excel\test1.xls 見える部分には、 test1.xls としておいてもよいと思います。フルファイル名を書かない場合は、一般的には、デフォルトのフォルダになります。 このような長いファイル名が多く出てくるようでしたら、マクロは、Target.Offset(,5).Value として、ファイル名を取得するようにすると、表としてすっきりとします。

possibly
質問者

補足

ありがとうございます。出来ました。 もう少し教えてください。 2列目に書くファイル名ですが フルファイルネームの名前の一部だけ一覧表に test1←を入力し C:\Documents and Settings\UserName\My Documents\Excel\ + .xlsを入力しない方法はありますか?

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

構文って・・・一つの関数ぐらいで出来るシステムではないんですが。 具体的な仕様をもう少し煮詰めて、一つ一つ作っていくしかないでしょう。 例えばあるフォルダ内のファイル一覧を取得する方法 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html 特定のファイルを検索する方法 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_130.html この辺の機能を組み合わせて作っていくことになります。 手抜きで良いのならエクセル+VBAでなんちゃって管理システムはできますが、例えばアクセスとかそちらの方で作りこんだ方がもっとマシなものが出来ると思いますが。まぁどういうところまで一体化させるか次第ですけど。

関連するQ&A

  • VBAの構文

    VBAの構文を教えてください! 作業内容: 開くファイルの名前は都度違う。(ファイル名の始まりは同じ) 例えばDATA100310.xlsだったりDATA100315.xlsだったり。 マクロを走らせたいシート名は常に同じ。シート名の例)Critical 違うブック(常に同じ。例)フォルダ名:Item)にあるデータをもとに DATA100310.xlsのCriticalシートにVLOOKUPをかけ、フィルタでソート。 マクロを保存するのは、もとデータになる例)フォルダ名:Item のほう。 こんなこと可能ですか? 調べたんですけど、いまいちヒットせず…… すみません、よろしくお願いいたします。

  • Excel VBA コードを教えて下さい!

    お世話になっています。 今回は、次の事を実現するコードを教えて頂きたいと思います。 <データ入力ブック> A1=Book1 <----- 転記先のブック名(Excel文書名) A2="AAA" この<データ入力ブック>に入力されたデータを手掛かりにしてサブディレクトリにあるBook1のSheet2!A2に"AAA"を転記し保存。 ※2004年頃を最後にAccessのVBAにも触れていません。Excelは、一度も操作したこともなく同VBAは初めてです。 ※バージョンは、Excel2007。文書は、2003等との互換モード。 厚かましいお願いとは承知していますが、教えてもらえるととっても助かります。 非常に複雑な円の配置が自動化されたので私の仕事は明日で終わります。 月曜日からは、200文書へのデータ入力。 一々、200もある文書を検索して開いて当該のセルを探して入力していたのでは手間。 そこで、<データ入力ブック>に10項目程度の入力欄を設けて入力。 <データ入力ブック>でデータの入力・訂正も管理し、そして一括更新。 そういう仕組みを日曜日の夜の3、4時間で完成したいと思っています。 そういう事情ですので、教えてもらえるととっても助かります。

  • VBAで情報取得

    Book1のA列の文字をもとに、 Book2(開いていない)からデータを取得する方法は どのような構文になりますか? <Book1> あああ <Book2> あああ  11111  東京 【やりたい事】 Book1に 11111、東京の情報を取得したい。 関数でいえばVLOOKUPです。 VBAでの方法をご存知の方ご教授お願い致します。

  • エクセルVBA ハイパーリンクを別ブックに

    皆さんこんにちは。 エクセル2013使用のVBA初心者です。 ふと「出来るのかな?」と思ったことを質問しておりますので とんちんかんな内容でしたらごめんなさいです。 現在book1.xlsmのユーザーフォームで記入した内容を book2.xlsxの特定のセルに反映させるマクロがあります。 book2にハイパーリンクを施してデータが格納してあるフォルダーに 飛ぶようにしたいのですが 直接book2に個人個人が記入すると誤ってデータを消されてしまう可能性があるので 出来るだけbook2は閲覧とハイパーリンクをクリックするのみにしたいのです。 book1のユーザーフォームに (1)ハイパーリンク先を指定するテキストボックスのようなものを設ける (2)book2の特定のセルに(1)で記入したハイパーリンクを反映させる という事は可能ですか?

  • VBAでセル選択時に別シートのマスター一覧を表示させたい

    同じブックに ・データ入力シート ・品番マスター[1|A-100] ・部門マスター[1|関東] があるとします。 データシートの品番マスターのセルがアクティブになった時に メッセージボックスでも何でもいいのですが 品番マスターの一覧が画面上に表示されるようにしたいのです。 あわよくば、1と入力したらセルに1と入って メッセージボックスが自動で消えるようになればありがたいです。 このようなことがEXCELで可能かと できれば、VBA構文を教えていただければと思います 宜しくお願い致します

  • EXCEL VBAについて

    VBAでCSVファイルをテンプレートのBBOKに読込むコードを 作り、CSVファイルから読込んだBOOK1データを集計する BOOK2を作成しています。 BOOK1・11/21・・・11/21・・・11/22・・・11/23と続きます      A     B     C      D 1  ID     店名   売上    日付 2 1104567   渋谷店  190,809   11/21 3 1102031   新宿店  209,808   11/21 4 1103450   横浜店  108,765   11/21 BOOK2・集計      A    B    C       D       E 1  ID   店名   11/21    11/22     11/23 2 1104567  渋谷店  190,809   203,487 3 1102031  新宿店  209,808   340,876 4 1103450  横浜店  108,765   547,627 ※BOOK1とBOOK2のIDの並び順は一致していません。 上記のBOOK1のデータをBOOK2に読込ませたいと考えています。 VLOOKUPやINDEX関数を使用しようかと考えたのですが、日付毎に ファイル名が違うのと、集計のファイルには外部参照をさせたくないと 考えています。 VBAで作成したいコードはBOOK1からBOOK2の日付のセルにIDを検索条件として日付毎のファイルを読込ませたいです。 フォームで日付を入力し、コピーするBOOK2のセルを指定後、BOOK1を選択するためにダイアログボックスを出したいです。 BOOK2のIDを検索条件としてBOOK1から一致する売上セルを抽出するコードだけでもわかれば何とか作成できそうなのですが、 ご教授いただけませんでしょうか?

  • EXCEL VBA 共有ファイルと入力フォーム

    データ入力を複数人で行うため、素のデータBook Aと入力フォームを持つBook Bがあります。 Book Bを開くと自動的にBook Aを開き、入力フォームでデータをBook Aにデータを入れていくVBAを作成しています。 EXCELのフォームはそのBook上での起動でPopUP的に表示されます。(Book Bのシート表示上でフォームが表示される) ユーザーからの要望で、Dataの入力状況を確認しながら、入力したい。つまり、Book Aのデータシートを背面に表示して、その上に入力フォームを表示したい。(入力フォームは常に手前に表示したい) 同じBooK内ならデータシートをセレクトしてフォームを開けばいいのですが、このような場合には、どうしたらいいでしょうか? お知恵をお貸しください。

  • VBAでsheetのコピー

    初めまして、宜しくお願い致します。環境:WindowsXPSP3EXCEL2010やりたい事Book1に複数の名前の付いたsheetがあります。sheetの数は可変です。このBook1のsheetをVBAから新に作成するBook2のsheet1に纏めたいのですが、Book2のsheet1だけに纏めたいのですが、Book2のsheet1の名前は、固定で構いません。Book1の一番初めのsheetにコピーする時だけ3行目にある見出しだけは、Book2のsheet1に付けたく。それ以外のBook1のsheetは、デターだけをコピーしたいのですが、作成したマクロでは、実行時エラーがでます。【実行時エラー'9'】【インデックスが有効範囲にありません】とでます。次の部分です。「Sheets("mySheetName(i)").Copy Before:=Workbooks("Book1").Sheets("Sheet1")」また、Book2のsheet1の名前は固定で構いません。しかし、マクロの記述の仕方も判りません。どなたかご教授願います。何卒宜しくお願い申し上げます。

  • VBAの構文で教えてください

    VBAの繰り返し処理 Do Until ~について教えてください。 シートの行列を全て書いてしまうと長くなるので 少し省略させていただきます。    A  B  C  D 1 2008 1 ○ 2008 2 2008 2 × 2008 このような羅列がデータ検索の際に何行になるかわからない状態のデータがあります。 C 列はBが1の場合○、2の場合は× D 列はAが数字があればそのままコピーするようにくみました。 ここで教えていただきたいのが、現在私はCとDの構文は AまたはBに数字があればC,Dに反映するという構文ではなく C、Dの列の最後まで全て数式を入力する構文にしています。 なので、A,Bに入力があってもなくても数式が飛ぶような構文になっています。 そこで、DO Until ~ を使用し A列が空白になるまで処理を繰り返すとすればいいのかなとおもうのですが、 Dim n as integer n=1 Do Until Sheets("sheet1").Cells(n, 1) = "" 空白までという構文(正しいかはわかりませんが)で行き詰っています。 これ以降のAが空白ならDに貼り付ける、 B列も同様に空白まで検索し○または×に置き換えるとは どのうように組み立てたらいいのでしょうか? また、申し訳ないのですが Cが×ならその列の背景を色づける(今回の場合なら2の列) とことまでしてみたいのですが・・・ このようなことが可能であれば教えていただければと思います。 VBAははじめたばかりで不勉強な点も多々ありますがよろしくお願いします。

  • Excel VBAのカウントについて

    Excel2003で表を作成しています。 画像のような表を作成しているのですが、 左のデータから右の表に数を入力するのに、VBAで出来ないでしょうか? COUNTIFを使おうと思ったのですが、COUNTの条件が3つありますし、 左のABCの列は500行くらいデータが入っているので出来ればVBAで出来たらと思いました。

専門家に質問してみよう