1380868376 Excelの関数およびマクロ等に詳しい方におすすめです。

添付ファイルをご覧いただきたいのですが。
「テストブックB」というブックの「テストシートB」シートのとあるセルに、

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

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

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/10/04 15:32:56
  • 終了:2013/10/09 12:58:59

回答(4件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982013/10/04 16:05:22

ポイント50pt
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行目ということでいいんですよね?

id:moon-fondu

はい、うまくいきました、ありがとうございます。
でも抽出した文字列がテストシートBのA1セルに出てきましたね。

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

2013/10/05 12:02:38
id:moon-fondu

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

2013/10/05 12:03:17
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492013/10/04 17:06:31

ポイント130pt

(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件のコメントを見る
id:windofjuly

ありそうなミスを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)
)

2013/10/05 16:29:16
id:moon-fondu

うまくできました!ありがとうございます(^_^;)

2013/10/09 12:56:39
id:takashi_m17 No.3

たか回答回数104ベストアンサー獲得回数122013/10/04 19:35:53スマートフォンから投稿

ポイント5pt

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


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

id:moon-fondu

確かにそうですね。
ただ、ブックが分かれている状況でして…。

2013/10/05 12:03:46
id:taknt No.4

きゃづみぃ回答回数13539ベストアンサー獲得回数11982013/10/05 12:49:26

ポイント130pt
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


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

id:taknt

中身もよくわからないまま回答された関数を使うよりも、
信頼できる結果を得てもらえるのです

2013/10/06 21:24:22
id:moon-fondu

ありがとうございます、うまくできました(^_^;)

2013/10/09 12:56:50

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません