[[20151003230155]] 『ExecuteExcel4Macro について』(エイチ・アイ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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


seiya さん、
上記のコードをご紹介いただきまして、ありがとうございます。正直のところ、現在の
私の知識ではちょっと理解できないような難しい領域に入っております。それをご了承
いただき、よろしければおしえていただきたいのですが。ご紹介いただいたコードを早
速コピー貼り付けして、試してみましたところエラーが出ました。

エラーの箇所は後半部分の、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


seiya 様

サンプル拝見いたしました。ありがとうございました。これから自分が作った
BOOKがどこが間違っていたのか確かめていきます。
(エイチ・アイ) 2015/10/05(月) 22:06


 DLが確認されたので、リンクは削除します。

 各コントロール名を確認してください。
(seiya) 2015/10/05(月) 23:07

ありがとうございました。
(エイチ・アイ) 2015/10/05(月) 23:22

seiya さん

先日は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

ありがとうございます。折角親切におしえていただいたのに、こちらは大変礼儀を欠いた言動を
いたしまして、申し訳ございません。
(エイチ・アイ) 2015/10/11(日) 23:39

 私は気にしていません。

 ひょっとしここも?
 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


ありがとうございましす。現在、必要なデータをBookAに固めて置いておいて、そこから
BookBに取り出すことには成功しております(BookAは閉じたままで)。この状態でも十分
に、用途に応じた数種類の帳票に同じデータを出力することができます。
とにかく当方、まだまだ初心者の域を脱しておらず、「こんなこともわからないのか。」
といった質問もありますが、気が向いたらでいいので、アドバイスをいただけたら幸いです。
(エイチ・アイ) 2015/10/12(月) 00:12

 エイチ・アイさん
 わからないことは、どしどし質問してください。
 わかる範囲でお答えします。
(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.