人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Excelの関数およびマクロ等に詳しい方におすすめです。
添付ファイルをご覧いただきたいのですが。
「テストブックB」というブックの「テストシートB」シートのとあるセルに、

「もしテストブックAというファイルのテストシートAの1行目に「26」という数字があった場合、その数字のあるセルから8列下の文字列(数値)を引用する」

といった文字列(数値)を表示させたいのです。

そのような関数等ご存じの方がいらっしゃいましたら、お教えいただきたい次第です。
よろしくお願い致します。

1380868376
●拡大する

●質問者: moon-fondu
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● きゃづみぃ
●50ポイント
Sub main()
 Dim a As Long
 Workbooks.Open Filename:="テストブックA.xls"
 For a = 1 To Columns.Count
 If Workbooks("テストブックA.xls").Sheets("テストシートA").Cells(1, a) = 26 Then
 ThisWorkbook.Sheets("テストシートB").Range("A1") = Workbooks("テストブックA.xls").Sheets("テストシートA").Cells(9, a)
 Exit For
 End If
 Next a
 Workbooks("テストブックA.xls").Close
End Sub


8列下とあるけど 列は 左右です。

1行目から 8行下ということは 9行目ということでいいんですよね?


moon-fonduさんのコメント
はい、うまくいきました、ありがとうございます。 でも抽出した文字列がテストシートBのA1セルに出てきましたね。 R2セルに抽出した文字列を表示させて、さらにR3セルには“27”に一致する列の9行目の数値を、R4セルには“28”に一致する列の9行目の数値を、R5セルには“29”に一致する列の10行目の数値を・・・とマクロを繰り返していき、最終的にR列にデータがないセルに至るまで処理を繰り返して行うようなマクロを、もしよろしければお教えいただけないでしょうか?

moon-fonduさんのコメント
すみません間違えました、「R5セルには“29”に一致する列の9行目の数値を」でしたm(_ _)m

2 ● うぃんど
●130ポイント

(1)もっとも単純な式

=HLOOKUP(26,[テストブックA.xls]テストシートA!1:9,9,FALSE)

※上の式を入力するときはテストブックA.xlsを開いた状態で入力してください
※正常に機能した後であればテストブックA.xlsは閉じていてもかまいません。
※ファイルを開くときに「ほかのファイルへの自動リンクが設定されています。」が出ますので、
面倒ですが「はい」を選択してください。以下同様です。

(2)該当なしの時にエラーになると嫌な場合はエラー処理も入れる

=IF(
 ISERROR( HLOOKUP(26,[テストブックA.xls]テストシートA!1:9,9,FALSE) ),
 "×",
 HLOOKUP(26,[テストブックA.xls]テストシートA!1:9,9,FALSE)
)

※構造をわかりやすくするため行を分けてますが一行に書いてもかまいません。

(3)関連事項です。下記も参照しておいてください。
http://office.microsoft.com/ja-jp/excel-help/HP005209114.aspx
http://office.microsoft.com/ja-jp/excel-help/HP010102338.aspx


余計なお世話
マクロを知ってしまうとうれしくて使いたくなる人が多いのですが、
Excelが本来持っている基本機能をおろそかにするとマクロもうまく使いこなせません。
基本機能を知らない人ほどマクロに走ってしまいがちで、
操作する対象の基本を知らずに作ったマクロそのものもお粗末になりますので注意しましょう。


moon-fonduさんのコメント
ありがとうございます、特に(2)のエラー処理を含めた関数でうまくデータを引っ張ることができました! が、抽出先のデータが例えば「=SUM(AD5:AD9)」等の関数のセルの場合、うまくデータを引っ張ることが出来ないのです(;▽;) 「=SUM(AD5:AD9)」にて導かれる、例えば“25000”といった“値”として、関数を無視してデータを引っ張ってこれるような関数はないでしょうか? 度々すみません、もしお気が向きましたらで結構ですので、よろしくお願いします。

うぃんどさんのコメント
>「=SUM(AD5:AD9)」等の関数のセルの場合、 >うまくデータを引っ張ることが出来ない その程度で取得に失敗するようなものではありませんので、 もっともシンプルな(1)の式を使ってどのような結果になるのかが知りたいです。 式を自分なりに改造した場合は、その式も載せてください。 マクロと違って使っている関数は1つだけなので、 中身もよくわからないまま回答されたマクロを使うよりも、 信頼できる結果を得てもらえるのですが使い方を誤るとどっちもどっちに・・・。 実際にはもっともっと複雑な式が入っているという可能性を考慮して、 念のため、別の関数(こちらは2つ使います)も用意しておきます。 (b1)列を得る >|| =MATCH(26,[テストブックA.xls]テストシートA!1:1,0) ||< (b2)該当列の9行目の値を得る >|| =INDIRECT("[テストブックA.xls]テストシートA!R9C"&MATCH(26,[テストブックA.xls]テストシートA!1:1,0),FALSE) ||< (b3)IFでエラー対策する >|| =IF( ISERROR( MATCH(26,[テストブックA.xls]テストシートA!1:1,0) ), "×", INDIRECT("[テストブックA.xls]テストシートA!R9C"&MATCH(26,[テストブックA.xls]テストシートA!1:1,0),FALSE) ) ||< http://office.microsoft.com/ja-jp/excel-help/HP010062414.aspx http://office.microsoft.com/ja-jp/excel-help/HP005209139.aspx

うぃんどさんのコメント
ありそうなミスを2つほど・・・。 (a)コピー貼り付けで1:9が2:10に変わってたという場合 変わってほしくない部分に$を付加して絶対参照にしてください。 (1)の場合 >|| =HLOOKUP(26,[テストブックA.xls]テストシートA!$1:$9,9,FALSE) ||< (b1)の場合 >|| =MATCH(26,[テストブックA.xls]テストシートA!$1:$1,0) ||< (b)修正ミス IFを使っているほうの修正箇所は二箇所です。 (2) >> =IF( ISERROR( HLOOKUP(<span style="color:#FF0000;">26</span>,[テストブックA.xls]テストシートA!1:9,9,FALSE) ), "×", HLOOKUP(<span style="color:#FF0000;">26</span>,[テストブックA.xls]テストシートA!1:9,9,FALSE) ) << (b3) >> =IF( ISERROR( MATCH(<span style="color:#FF0000;">26</span>,[テストブックA.xls]テストシートA!1:1,0) ), "×", INDIRECT("[テストブックA.xls]テストシートA!R9C"&MATCH(<span style="color:#FF0000;">26</span>,[テストブックA.xls]テストシートA!1:1,0),FALSE) ) <<

moon-fonduさんのコメント
うまくできました!ありがとうございます(^_^;)

3 ● たか
●5ポイント

余計なお世話2
マクロも、関数によるリンクも、ファイルを跨ぐとどうしても、ファイルの保存場所や随時反映が出来なかったりと色々制約が出てきます。
僕なら極力一つのファイルに纏めます。


自分だけで使うならまだしも人に渡す可能性が有るならあり得ないです。


moon-fonduさんのコメント
確かにそうですね。 ただ、ブックが分かれている状況でして…。

4 ● きゃづみぃ
●130ポイント
Sub main()
 Dim a As Long
 Workbooks.Open Filename:="C:\Users\kopp\Documents\VBA\4\テストブックA.xls"
 For a = 1 To Columns.Count
 b = Workbooks("テストブックA.xls").Sheets("テストシートA").Cells(1, a)
 If IsNumeric(b) Then
 If b >= 26 Then
 c = b - 24
 ThisWorkbook.Sheets("テストシートB").Cells(c, "R") = Workbooks("テストブックA.xls").Sheets("テストシートA").Cells(9, a)
 End If
 End If
 Next a
 Workbooks("テストブックA.xls").Close
End Sub


これで 全部セットされるかと思います。


きゃづみぃさんのコメント
中身もよくわからないまま回答された関数を使うよりも、 信頼できる結果を得てもらえるのです

moon-fonduさんのコメント
ありがとうございます、うまくできました(^_^;)
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ