• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA 関数 複数行内にある任意の列の項目の出力)

VBA関数で複数行内の任意の列の項目を出力する方法

このQ&Aのポイント
  • VBAを使って複数行内にある任意の列の項目を出力する方法について教えてください。
  • 業務で他社へ提出する申請書を作成するVBAを作成したいです。提出物はフォーマットが異なるため、申請書の項目をエクセルファイルにまとめています。
  • それぞれの申請書の項目を別シートの原紙フォーマットに出力して別のブックを作成したいです。何かトリガーを作って、行の項目を申請書の原紙フォーマットに出力する方法を教えてください。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

ご自身もお気づきの通り、 > 悩んでます。。 物凄く悩ましい問題ではあります。 正直、この手の処理をエクセルで行うのは、 個人的にはオススメしたくありません。 データのリスト(表)から必要なデータ(行)を抜き出し、 それを加工して帳票として印刷する・・ となると、これはデータベース的な考え方です。 エクセルの本分である表計算的な要素が一つも残りません。 このような処理、エクセルでもできないことはもちろんありませんが、 アクセスなどのデータベースを扱えるソフトに任せるべきです。 さて、本題です。 考え方として、 > 案件(行)が増える度にボタンを作るのも現実的ではない おっしゃるとおりです。 基本的にボタンは行列番号にはリンクさせづらいので、オススメしません。 踏まえて。 データリストのフォーマットも帳票のフォーマットもさっぱりわかりませんので、 とりあえず流れだけ、考え方だけ紹介しておきます。 前準備として、印刷される帳票原紙に「印刷したいデータ」をおくためのシートを作っておきます。 例えば「データ」と言うシートを用意し、ここの1行目に「印刷したいデータ」を用意します。 各帳票は、この「印刷したいデータ」から各項目を持ってくるように数式を入れておきます。 例えば、「X申請書」のシートの案件名欄には「=データ!A1」としておきます。 これで、「データ」シートの1行目が変われば「X申請書」の内容も変わる、 と言うところまではご理解いただけると思います。 データリストでは以下のような処理を前提にマクロを組みます。 ・フォーカスがある行の行番号を記憶する ・「申請書」のブックを開く ・リストの「記憶した行」をコピーする ・「申請書」ブックの「データ」シートの1行目に貼り付ける 以上のような流れです。 かなり適当ですが、 Sub Sample() Dim ASheet As Worksheet Dim BBook As Workbook, BSheet As Worksheet Dim TRow As Long     Set ASheet = ActiveSheet     TRow = ActiveCell.Row     Set BBook = Workbooks.Open(Filename:="フルパス\申請書.xls")         Set BSheet = BBook.Sheets("データ")     ASheet.Rows(TRow).Copy BSheet.Range("A1")     Application.CutCopyMode = False End Sub こうしておけば、印刷したい行にフォーカスをあわせる必要はありますが、 マクロを起動するボタンは一つで済みます。 一応、この考え方で処理は可能と思いますが、 正直なところ良い手段とは決して言えません。

club_question
質問者

お礼

お礼が遅れて申し訳ございませんでした! ありがとうございます! むむむ。。。 仰る通りDB的な考えですよね。。 駐在先の環境ではアクセスが使えずでして。。 しかし上記、コードは非常に参考になりました!

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

他シートのセルを参照させる式はお分かりですか? Sheet2のセルB3がSheet1のセルA2を参照するのであれば Sheet2のセルB3に式[=Sheet1!A2]を設定する。 この方法だと、セルB3は常にSheet1のセルA2しか見ませんが、 indirect関数を用いると、値を変更することが可能。 Sheet2のセルA1に参照先の行数(上記の例なら2)を設定 (文字色を白にしておくと見えなくて良い) で、Sheet2のセルB3は式[=indirect("Sheet1!A" & A1)]を設定する。 Sheet2のセルA1の値が[2]なので、式[=Sheet1!A2]と同じ結果が得られる。 Sheet2のセルA1の値を、[3]とか[4]に変えてみれば分かるはず。 > 何かトリガー(例えばボタン)を作って、それを作動させて、 原紙(複数あるでしょうが、すべてor先様を判断)のセルA1に行の値を設定。 以上を利用して、 >別シートにある申請書の原紙フォーマットに出力して の原紙側から値を参照しておいて、コピー&形式を選択して貼り付け-値 それを別名で保存。 ここは「マクロの記録」で頑張ってください。

club_question
質問者

お礼

お礼が遅れました! 申し訳ございませんでした。 いただきましたコメントで途中まで進めましたが、 途中で自分がやっている事がエクセルでは、 少々現実的ではない。。。 という事に薄々と感じ始め途中で心が折れました。。 今後の業務の上で参考にさせていただきます!

関連するQ&A