- ベストアンサー
Excelにある特定のRange名がある場合のみAccessからエクスポートする方法
Access2003からExcel2003へデータをエクスポートする際に困っていることがあります。 ExcelテンプレートはAとBの2種類あります。ほぼ同じ内容ですが、Rangeの数がBのほうがAより1つ多くなっています。 テンプレートBに1つ追加されているこのRangeの名前をここで"abc"としておきます。 AccessVBAで obSht.Range("abc").Value = rs!abc のようにレコード上のデータをセル値に一つ一つコピーしていきたいのですが、abcというRangeのないテンプレートAにこの式は必要ありません。 そこで、abcというRangeがExcelにある場合のみこの式を追加、ということがしたいのですが、どのように記述すればよいでしょうか。 If [ExcelにabcというRangeがある] Then obSht.Range("abc").Value = rs!abc End If のようにしてみたいのですが。。。 回答どうぞよろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
"abc" っていう名前で定義されている範囲は確かに Range ではありますが、そもそも "abc" ってのは Workbook.Names コレクションの中の Name オブジェクトです。 これを確認するには、マクロの記録で 1. 適当な範囲を選択 2. そこに適当な名前を定義 を記録してその VBA コードを見てみるとわかります。 ActiveWorkbook.Names.Add Name:="hoge", RefersToR1C1:="=Sheet1!R14C1:R17C2" みたいに記録されます。 ですので対象のワークブックの Names コレクションから "abc" という名前がついた Name オブジェクトを探せばいいんじゃないかな、なんて思いつきます。 Dim aName As Name For Each aName In targetBook.Names If aName.Name = "abc" Then MsgBox "発見" Exit For End If Next aName みたいな。
その他の回答 (1)
- KenKen_SP
- ベストアンサー率62% (785/1258)
> obSht.Range("abc").Value = rs!abc で、名前 abc が存在しないと実行時エラーが発生するはずですから、それを 利用します。名前 abc が存在すれは代入されるし、存在しなければ素通りす ると思いますが、確認はしてません。 On Error Resume Next obSht.Range("abc").Value = rs!abc On Error Goto 0
お礼
エラーを発生させて素通りさせる方法について、大変勉強になりました。お礼が遅れ大変申し訳ございません。ありがとうございました。
お礼
お礼を申し上げるのが送れ大変申し訳ございません。 非常に参考になりました。ご提示いただいたコードを 多少いじって適用してみたところ、要求どおりに 動作しました。 本当にありがとうございました。