[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ExecuteExcel4Macro について』(エイチ・アイ)
おしえていただきたいのですが。
2つの BOOK "BookA"及び"BookB"がありましてこれらを関連付けたいと思います。"BookA"にはデータリスト(表)が
入力されておりこのデータを"BookB"の帳票に入力するため、"BookB"にユーザーフォームを設定、Combobox1を配置して
"BookA"のデータを取り込みます。
他の書き込みによりExecuteExcel4Macroという手法があることを知りまして、その人のやり方に従って"BookB"のユーザー
フォームに下記のコードを記載したところ、"BookB"の"Combobox1"の中に"BookA"の縦(左端)のデータを取得することが
できました。
Private Sub UserForm_Initialize()
Dim i As Long Dim myVal Dim myPath As String
myPath = "'" & ThisWorkbook.Path & "\[BookA.xlsm]Sheet1'!"
For i = 2 To 12 myVal = ExecuteExcel4Macro(myPath & "R" & i & "C1") Combobox1.AddItem myVal Next i
End Sub
更に"BookB"のユーザーフォームに"Textbox1"を配置して"BookA"横のデータを取り込みたいと思うのですが、Vlookup等
の手法を使って取り込むことは可能でしょうか。
< 使用 Excel:Excel2013、使用 OS:Windows8 >
ExecuteExcel4Macro はセルの値を取得するのが限界です。 関数等の複数セル領域に相当する引数として使うことは不可能です。
やるなら、VLOOKUPが参照する領域をすべて、自ブックに取り込み、そこを参照するということになります。 でも、わざわざそんな窮屈なことをする意味は全くないですね。
というか、現在のコードでも、素直に BookA を開いて、そこを参照するほうが、よっぽどわかりやすいですよ。 ましてや、領域を相手にした関数なんかを使いたいなら、ブックをオープンして使いましょう。
開いているのを見せなければいいわけですから。
(β) 2015/10/03(土) 23:41
上記は仕事で使いたいのですが、"BookB"にあたる物はいくつかあり用途に応じて様々な
ExcelBookを作ろうと考えていました。その基本データの全てを"BookA"から取得できるように
ならないかと思い質問をいたしました。
(β)さんのおっしゃる通りやってみます。
(エイチ・アイ) 2015/10/04(日) 08:29
> ExecuteExcel4Macro はセルの値を取得するのが限界です。 > 関数等の複数セル領域に相当する引数として使うことは不可能です。
断言しない方がいいんじゃない?
>更に"BookB"のユーザーフォームに"Textbox1"を配置して"BookA"横のデータを取り込みたいと思うのですが、Vlookup等 >の手法を使って取り込むことは可能でしょうか。
この意味がよく分からないけど、ExecuteExcel4Macro で関数も使用できますよ?
e.g. myValがどんな値(数値/文字列)か不明ですが
dim temp if not isnumeric(myval) then myval = chr(34) & myval & chr(34) temp=ExecuteExcel4Macro("vlookup(" & myval & "," & myPath & "c1:c2,2,false)") (seiya) 2015/10/04(日) 11:34
更に"BookB"のユーザーフォームに"Textbox1"を配置して"BookA"横のデータを取り込みたい
と思うのですが、Vlookup等の手法を使って取り込むことは可能でしょうか。
の意味ですが、
"BookA"に船舶のデータを表として記載しております。
A B C D 1 船名 Aトン Bトン Cトン 2 アルファ丸 4,950 2,225 5,890 3 ブラボー丸 1,890 868 2,890 4 チャーリー丸 3,800 1,990 4,280 といった具合です。
ExecuteExcel4Macroによって、"BookB"のユーザーフォームCombonox1に"BookA"のA列の
船名は取り出せました。
更に"BookB"のユーザーフォームに配置した"Textbox1/2/3に"Combobox1"(船名)をベース
にそれぞれの船舶の個々の数字(横のデータ)を取り出したいのですが、現在のところ
Worksheetfunction/Vlookup等の手法ではできておりません。
また前記の標準モジュールへの記載による結果は、偶然得られたもので、そこに記載されている、
myvalあるいは myPathといったコードの値が上記表中に該当する物かわかりません。
ExecuteExcel4Macroにこだわらず、何か良い方法はありますでしょうか。
(エイチ・アイ) 2015/10/04(日) 23:56
私の理解が正しければ
Option Explicit
Private myPath As String, LastR As Long
Private Sub UserForm_Initialize() Dim i As Long myPath = "'" & ThisWorkbook.Path & "\[BookA.xlsm]Sheet1'!" '--最終行取得 LastR = ExecuteExcel4Macro("max(index((" & myPath & "c1:c1<>"""")*row(" & myPath & "c1:c1),0))") For i = 2 To LastR Me.ComboBox1.AddItem ExecuteExcel4Macro(myPath & "r" & i & "c1") Next End Sub
Private Sub ComboBox1_Change() Dim i As Long, myVal For i = 1 To 3 Me("textbox" & i).Value = "" Next With Me.ComboBox1 If .ListIndex > -1 Then myVal = .Value If Not IsNumeric(myVal) Then myVal = Chr(34) & myVal & Chr(34) Else myVal = Val(myVal) End If For i = 1 To 3 Me("textbox" & i).Value = _ ExecuteExcel4Macro("vlookup(" & myVal & "," & myPath & "r2c1:r" & LastR & "c4," & i + 1 & ",false)") Next End If End With End Sub
ネットに書かれていることは全てが正しいとは限りません。 何を根拠にあのような回答をつけるのか不明ですが、気を付けましょう。 (seiya) 2015/10/05(月) 00:47
間違ったコメント、申し訳ありません。 一応は、コードを書いて検証したつもりでしたが、長い間つかっていなかったものですから、 すっかり、ぼけてしまって、A1形式のVLOOKUP で試していました。
失礼しました。
(β) 2015/10/05(月) 06:32
エラーの箇所は後半部分の、Me("textbox" & i).Value = ""
この記述でありました(黄色のマーク)。内容は
実行時エラー'-2147024809(80070057)':
指定されたオブジェクトは見つかりません。
この"textbox"を私が提示した"Textbox1"あるいは"2"若しくは"3"に置き換えることで
対処は可能なのでしょうか。それとも根本的に私の理解が間違っているのでしょうか。
(エイチ・アイ) 2015/10/05(月) 20:30
>BookB"のユーザーフォームに配置した"Textbox1/2/3に"Combobox1"(船名)をベース にそれぞれの船舶の個々の数字(横のデータ)を取り出したいのですが、
コントロール名がその通りならきちんと表示されるはずですが?
(seiya) 2015/10/05(月) 21:11
サンプル拝見いたしました。ありがとうございました。これから自分が作った
BOOKがどこが間違っていたのか確かめていきます。
(エイチ・アイ) 2015/10/05(月) 22:06
DLが確認されたので、リンクは削除します。
各コントロール名を確認してください。 (seiya) 2015/10/05(月) 23:07
先日はExecuteExcel4Macroの記述についておしえていただき、ありがとうございました。
おかげ様で、やっと私のExcelフォームに応用することができました。といっても、私は
seiya さんにおしえていただいた記述の内容をまだ十分にはわかっておりません。よろし
ければ(で、いいのですが)おしえていただけますでしょうか。先日おしえていただいた
記述はBookAについて列Aから列Dまでの連続した記述でしたが、1列飛ばすことはできます
でしょうか。
A B C D E 1 船名 Aトン Bトン 記 号 Cトン 2 アルファ丸 4,950 2,225 ALPHA 5,890 3 ブラボー丸 1,890 868 BRAVO 2,890 4 チャーリー丸 3,800 1,990 CHARLIE 4,280 (D列を飛ばす。)
(エイチ・アイ) 2015/10/11(日) 21:18
For i = 1 To 3 ..... Next のループのなかで、 i <= 2 なら 前のように i + 1 から持って来て、 i >= 3 なら i + 2 から持ってくるように 条件分岐するといいんじゃないでしょうか。 意味を理解した上で、コードは作って見て下さい。
なお、名指しで質問しないほうが良いと思いますよ。
---- 【蛇足】 ちなみに、ExecuteExcel4Macroについては、こちらも参考になるでしょう。 http://excel-ubara.com/excelvba4/EXCEL219.html http://excel-ubara.com/excelvba5/EXCELVBA242.html 個人的には、↑にある、 ExecuteExcel4Macroは、余り積極的には使わないという意見に賛成です。 ヘルプも無い?ので、かなり限定的な使い方になるでしょう。
(γ) 2015/10/11(日) 23:15
(エイチ・アイ) 2015/10/11(日) 23:28
衝突!
スレのタイトルに名指しは感心しませんが同スレないなら名指しでも構いません。
D列を飛ばして E列までなら
For i = 1 To 4 If i <> 3 Then Me("textbox" & i).Value = _ ExecuteExcel4Macro("vlookup(" & myVal & "," & myPath & "r2c1:r" & LastR & "c4," & i + 1 & ",false)") End If Next
でいいでしょう (seiya) 2015/10/11(日) 23:32
私は気にしていません。
ひょっとしここも? Me("textbox" & i - IIf(i>3,1,0)).Value = ^^^^^^^^^^^^^^^ (seiya) 2015/10/11(日) 23:45
> ありがとうございます。コードはただ今勉強中なのですが、とにかく解説書等が少なく、 > 書店を歩きまわりましたが、資料・参考書が見つからなくて四苦八苦しております。 > ゆっくりですが、コードの意味は勉強しております。
今回の追加質問に限っていいますと、特にExecuteExcel4Macro固有の話ではないので、 普通のVBAの本に書かれていることを理解されると対応可能なはずです。 引き続き基本的なテキストを勉強されると良いと思います。
Dim j As Long というような変数を宣言しておいて
For i = 1 To 3 If i <= 2 Then j = i Else j = i + 1 End If Me("textbox" & i).Value = _ ExecuteExcel4Macro("vlookup(" & myVal & "," & myPath & "r2c1:r" & LastR & "c4," & j + 1 & ",false)") Next などと書くこともできます、という意味でした。
# 回答者指定の件は、私見を書いたまでです。 # 色々なお考えがあるようですね。
(γ) 2015/10/12(月) 00:06
エイチ・アイさん わからないことは、どしどし質問してください。 わかる範囲でお答えします。 (seiya) 2015/10/12(月) 00:26
もちろん、私も質問は大歓迎ですよ。
名前を限定してしまうと、その方がたまたま手が空かないときは、 回答が遅くなることもあります。見逃してしまうこともありえます。 一般論として、回答者が常にスタンバイしているわけでもありませんので、 余り限定しないほうが得策かな、と思ったまでです。 礼を欠くとかいうことは申し上げていません。
具体的なコードに対するコメントをされたほうがよいと思いました。 seiyaさんの示されたコードでうまくいきました。とか。 こう書くんですね、とか。
# 色々とデバッグするにも、普通に開いたほうがやりやすいと思いますし、 # 今後、機能を拡張(例えば検索とか、広い領域の値の取得とか)される際にも # 参考情報の取得で制約になりかねません。 # 普通に開く方法をとっていれば、参考情報は色々とあるはずです。 # 余り、その手法にこだわらない方がよいと思います。(くどくて済みません)
(γ) 2015/10/12(月) 09:06
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.