Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2010)
ファイルを開かずに検索して値を取得する方法について
投稿日時: 18/06/19 10:42:36
投稿者: takatada72

お世話になります。
 
今回、ファイルを開かずにセルの値を取得したいと考えております。
特定な場所の値を取得するには、下記のように行えば取得できるのが
分かりました。
MsgBox ExecuteExcel4Macro("'\\共有\Box Sync\File\[Pop3.xlsx]Sheet1'!R2C1"
 
そこで、検索にて、下記のようなリストから、番号を検索して、ヒットした行の
B、C、D、Eの値を取得したいと考えております。
 
ファイルを開かずにこのようなことは可能でしょうか
可能な場合、どのようなコードを使えば実現できるかを教えて下さい。
 
A B C D E
No 日付   番号 製品    パッケージ
1 2018/11 D101010 ぬいぐるみ 無し
2 2018/10 B121215 モール   袋
3 2018/09 D151523 メモ    袋
4 2018/09 J151213 タオル   箱
5 2018/08 G121213 マグ    箱
 
お忙しいとは思いますが宜しくお願い致します。

回答
投稿日時: 18/06/19 11:19:33
投稿者: mattuwan44

https://excel-ubara.com/excelvba5/EXCELVBA242.html
 
↑を見て今一度考えてみてください。
「開かずに」なにかをするより、
「開いてエクセルの機能を使う。」方が個人的にはお勧めです。
 
「開いたことを見せない」ことでユーザーは開いたことを意識することはないので、
それくらいでいいと思います。

投稿日時: 18/06/19 13:01:55
投稿者: takatada72

mattuwan44さん
 
お世話になります。
 
下記ご連絡頂きましてありがとうございました。
 
今回の目的は、サーバーの方で自動実行させたいと言う願望があり、
開かないようにできればと考えておりました。
 
一度、mattuwan44さんからのサイトを見させて頂いてから判断させて
頂きたいと思っております。
 
報告は、しばしお待ち下さい。

回答
投稿日時: 18/06/19 13:57:21
投稿者: mattuwan44

やってみないと確実なことは言えませんが、、、、
 
何件データがあるかわかりませんが、
その中から指定した値のあるデータを抽出するのですよね?
1000回とかループしてA列の個々のデータを読んで、
判断して、また列方向に個々のセルを読み取って抜き出してってやってると、
開くより遅くなるような気がします。

回答
投稿日時: 18/06/20 10:51:09
投稿者: WinArrow
投稿者のウェブサイトに移動

ADOを使った例を紹介します。
 
サンプルコード
 
Dim DataSource As String
Dim SQL As String, 指定NO As Long
Dim cn As Object, rs As Object
 
    指定NO = 1
    DataSource = "xxxx\pop3.xlsx;"
    Set cn = CreateObject("ADODB.Connection")
    SQL = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                        & "Data Source=" & DataSource & ";" _
                        & "Extended Properties=""Excel 12.0;" _
                        & "HDR=Yes"";"
    cn.Open SQL
    SQL = "SELECT NoA,日付,番号,製品,パッケージ FROM POPLIST WHERE NOA=" & 指定NO
    Set rs = CreateObject("ADODB.Recordset")
    With rs
        .Open SQL, cn, 1, 1
        Do Until .EOF
            Debug.Print .Fields(0).Value & " " & .Fields(1).Value & " " & _
                        .Fields(2).Value & " " & .Fields(3).Value & " " & _
                        .Fields(4).Value
            .MoveNext
        Loop
        .Close
    End With
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
End Sub
 
この例では、対象のブックに「POPLIST」という名前を定義しています。
項目名:[No]を「NoA」という項目名に変更しています。(「No」は、無視される)
 
 

回答
投稿日時: 18/06/20 12:50:41
投稿者: Suzu

元々の
 

引用:
今回、ファイルを開かずにセルの値を取得したいと考えております。
特定な場所の値を取得するには、下記のように行えば取得できるのが
分かりました。
MsgBox ExecuteExcel4Macro("'\\共有\Box Sync\File\[Pop3.xlsx]Sheet1'!R2C1"

 
引用:
今回の目的は、サーバーの方で自動実行させたいと言う願望があり、
開かないようにできればと考えておりました。

 
は、どのような意図でしょうか。
 
 
・Excelでファイルを開くと時間がかかると言うならファイルをコピーしてから開いては?
    特にサーバーが NAS等で Excelで直接開く事に時間が掛かる事があります。
 
http://www.geocities.jp/muisizen/network/index.html
http://www.koikikukan.com/archives/2014/04/04-015555.php
http://syskanri.seesaa.net/article/358495371.html
 
 
・それとも、サーバーへ条件を渡し、結果のみを得たい(ネットワークを流れる情報量を少なくしたい)という事?
 
WinArrow さんの方法も、Excelは開いていませんが、
全データを、ネットワークを介し サーバーからクライアントが取得し、
クライアント側で当該レコードを抽出しています。
 
サーバー側へ条件を渡し実行するには、サーバ側の準備が必要です。
データベースをExcel を使用するのではなく、SQL Server 等への移行とか。。

投稿日時: 18/06/29 17:13:31
投稿者: takatada72

返事が遅くなり恐縮します。
 
今回の投稿させて頂いた目的ですが、色々な共有に散らばっているファイルが有り、
1つづつ開いて確認する手間を軽減したく、サーバー上で、毎日自動にファイルの中身を
確認して、確認した内容をメールで送信してもらえるようにしたいのです。
※10ファイル程度あり、それぞれ、確認したい内容が異なりますが、確認する場所(セルの場所)
は固定されている状態です。
※手動だと、10ファイルを開けて、確認するので、時間がかかってしまうからです。
 
mattuwan44さんの投稿して頂いたのですが、上記の理由から、お手数をおかけしてしまいすみま
せんでした。
 
WinArrow さんは、私の理解力が乏しいため、理解してからの確認になってしまいます。
WinArrow さんが示して頂いたプログラムは、他でも応用ができそうなので、勉強したいと思います。
 
Suzuさんが提示して頂いたこちらの方法をファイル毎に参照場所をしていすれば、実現可能なように
思えてきました。こちらの方法でやってみたいと思っております。
MsgBox ExecuteExcel4Macro("'\\共有\Box Sync\File\[Pop3.xlsx]Sheet1'!R2C1"
 
みなさま、ありがとうございました。
 
一旦、閉じさせて頂きます。