添付ファイルをご覧いただきたいのですが。
「テストブックB」というブックの「テストシートB」シートのとあるセルに、
「もしテストブックAというファイルのテストシートAの1行目に「26」という数字があった場合、その数字のあるセルから8列下の文字列(数値)を引用する」
といった文字列(数値)を表示させたいのです。
そのような関数等ご存じの方がいらっしゃいましたら、お教えいただきたい次第です。
よろしくお願い致します。
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行目ということでいいんですよね?
(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が本来持っている基本機能をおろそかにするとマクロもうまく使いこなせません。
基本機能を知らない人ほどマクロに走ってしまいがちで、
操作する対象の基本を知らずに作ったマクロそのものもお粗末になりますので注意しましょう。
ありそうなミスを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(26,[テストブックA.xls]テストシートA!1:9,9,FALSE) ),
"×",
HLOOKUP(26,[テストブックA.xls]テストシートA!1:9,9,FALSE)
)
(b3)
=IF(
ISERROR( MATCH(26,[テストブックA.xls]テストシートA!1:1,0) ),
"×",
INDIRECT("[テストブックA.xls]テストシートA!R9C"&MATCH(26,[テストブックA.xls]テストシートA!1:1,0),FALSE)
)
うまくできました!ありがとうございます(^_^;)
余計なお世話2
マクロも、関数によるリンクも、ファイルを跨ぐとどうしても、ファイルの保存場所や随時反映が出来なかったりと色々制約が出てきます。
僕なら極力一つのファイルに纏めます。
自分だけで使うならまだしも人に渡す可能性が有るならあり得ないです。
確かにそうですね。
ただ、ブックが分かれている状況でして…。
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
これで 全部セットされるかと思います。
中身もよくわからないまま回答された関数を使うよりも、
信頼できる結果を得てもらえるのです
ありがとうございます、うまくできました(^_^;)
はい、うまくいきました、ありがとうございます。
2013/10/05 12:02:38でも抽出した文字列がテストシートBのA1セルに出てきましたね。
R2セルに抽出した文字列を表示させて、さらにR3セルには“27”に一致する列の9行目の数値を、R4セルには“28”に一致する列の9行目の数値を、R5セルには“29”に一致する列の10行目の数値を・・・とマクロを繰り返していき、最終的にR列にデータがないセルに至るまで処理を繰り返して行うようなマクロを、もしよろしければお教えいただけないでしょうか?
すみません間違えました、「R5セルには“29”に一致する列の9行目の数値を」でしたm(_ _)m
2013/10/05 12:03:17