質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

5289閲覧

【Excel VBA】Excelブックを開かず、指定した「列名」で列の値を返したい

pecchan

総合スコア555

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2019/01/28 05:26

Excel for Office 365、Win10です。

標題の通りです。
webで以下のサンプルを見つけましたが、応用できずにいます・・・。

サンプルソースを動作させるには
以下のように読み込む対象のExcel、1行目がフィールド行でないと取得できませんでした。
イメージ説明

しかし読み込むExcelは、以下のようなパターンもあり、フィールド行の位置が定まっていません。
イメージ説明

このような場合、どのように記述すべきでしょうか?

webのサンプルソース

VBA

1 2 Dim Target As String 3 Target = "C:\[test.xls]Sheet1'!" 4 5 6 For i = 1 To 256 7 If ExecuteExcel4Macro(Target & "R1C" & i) = "氏名" Then 8 TargetCol = i 9 Exit For 10 End If 11 Next i 12 13 If TargetCol = 0 Then 14 MsgBox "[ 氏名 ]フィールドが見つかりません。", vbExclamation 15 Exit Sub 16 End If 17 18 ''データの読み込み 19 For i = 2 To 10000 ''(1) 20 buf = ExecuteExcel4Macro(Target & "R" & i & "C" & TargetCol) 21 If buf = "0" Then Exit For ''(2) 22 23 ''【配列に格納する】 24 ReDim Preserve GetNames(i - 1) ''(3) 25 GetNames(i - 1) = buf 26 Next i 27 28 ''配列に格納したデータの確認 29 For i = 1 To UBound(GetNames) 30 Debug.Print GetNames(i) 31 Next i 32

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

アクティブにあるなことが前提なら話は違いますが、「Excelブックを開かず、指定した「列名」で列の値を返したい」というのはVBAの仕様上できません。

http://officetanaka.net/excel/vba/beginner/09.htm

シートで1列目のテキストの判定を行って感じになりますね...

投稿2019/01/28 05:41

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stdio

2019/01/28 09:05

出来るのは理解しましたが、 「複数セルの取得が必要で、そのセル数が多い時は、逆にこれでは遅くなってしまう事もあり得ます。」 「いつサポートされなくなるか分かりませんので、なるべく使わない方が良いでしょう。」 って書いてますよね。拡張性を考えると不便でしかないので、使わないのをおススメ致します。
guest

0

ベストアンサー

先頭行が見出し(タイトル)でないといけないというのは、ExecuteExcel4Macroのルールではなく、
単にこのプログラムがそのように書かれているという話ですね?

であれば、改造すればいいだけです。

最初のFor文で、1行目(R1行)の1列目から256列目までをループして「氏名」を探していますが、これを二重のループにして「n行目の1列目から256列目を探し、氏名と書かれたセルの行、列を特定する」というように改造します。

次に、後半のループで「i=2」と2行目からデータを探しに行っていますが、この「2」を前述の処理で見つけた「氏名」セルの行に書き換えてやれば、氏名がどこから始まっても動くプログラムになります。

ただ注意点が。今のExcelは列数の上限が256ではなく、もっとたくさんあるはずなので、そのあたり、「どこまで探すか」は今のExcel仕様にあわせて変えないと行けないかもしれません。

投稿2019/01/28 05:38

backyard

総合スコア534

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pecchan

2019/01/28 05:45

有難う御座います。 考え方、勉強になりました! やってみます!
guest

0

ExecuteExcel4Macro は古いコマンドですので、セル位置を指定するのに、A1形式ではなく R1C1形式(R行C列)で指定します。

例えば、 B2セルは、R2C2 となります。

下記のような感じで書き換えればいいでしょう。

vba

1 If ExecuteExcel4Macro(Target & "R2C" & i + 1) = "氏名" Then 2 3'中略 4 5 buf = ExecuteExcel4Macro(Target & "R" & i + 1 & "C" & TargetCol + 1)

投稿2019/01/28 05:40

hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pecchan

2019/01/28 05:46

有難う御座います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問