Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
ワークブックの読み取り方法について
投稿日時: 19/02/12 10:35:50
投稿者: taigernotora

ブックを呼び出す方法について教えて下さい。
 
 
【やりたいこと】
コードを作成しているブックから、他ブックの名前(拡張子含む)から呼び出してシートをコピーし、コードを作成しているブックに貼り付けたいと考えています。
 
【現状】
作成途中のコードは、Cells(7, 3)に呼び出すファイルのフルパスを記載して他のブックを呼び出しています。
 
可能であれば、現在のコードをベースに修正頂けますと幸いです。よろしくお願いします。
 
 
現在作成途中のコード

Option Explicit
 
Sub ワークブック読み取り()
Dim First As Worksheet 'コード記載ワークブック シート First
Dim data As Worksheet 'コード記載ワークブック シート data
Dim Origin As Worksheet 'ワークブック(TargetPath) アクティブシート
Dim Targetpath As String 'シートFirst ワークブックフルパス
Dim SName As String '対象シート名
 
With ThisWorkbook
  Set First = .Worksheets("First")
  Set data = .Worksheets("data")
End With
 
Targetpath$ = First.Cells(7, 3).Value '検索対象のファイルパス
SName = First.Cells(8, 3).Value '検索対象のワークシート
 
'ファイルパスのシートをOriginに格納
Set Origin = Workbooks.Open(Filename:=Targetpath$, ReadOnly:=True).Worksheets(SName)
 
'シートOrigin からコピーして貼り付け
Origin.Range("A:A").Copy
data.Range("A:A").PasteSpecial Paste:=xlPasteValues
   
'警告消し
Application.CutCopyMode = False
Origin.Parent.Close SaveChanges:=False
 
End Sub

回答
投稿日時: 19/02/12 12:03:26
投稿者: Suzu

提示されたコードで、やりたいことは実現出来ているのではないのでしょうか?
 
何か不満な部分があるのでしょうか?
 
 
 
コモンダイアログを利用したいとかそんな話かな?
 
【[ファイルを開く]ダイアログボックスを表示する(GetOpenFilenameメソッド)】
https://www.moug.net/tech/exvba/0060013.html
 
【もうひとつの[ファイルを開く]ダイアログボックス(FileDialogオブジェクト)】
https://www.moug.net/tech/exvba/0060085.html

投稿日時: 19/02/12 13:58:29
投稿者: taigernotora

>Suzuさん
 
コメントありがとうございます。
 
やりたいことを補足させて頂きますと、フルパス(\\■■■■■\■■\■■.xls)で入力している状態からファイル名(■■.xls)だけで検索ができるようにしたいという内容になります。
 
よろしくお願いします。

回答
投稿日時: 19/02/12 16:09:16
投稿者: Suzu

taigernotora さんの引用:

やりたいことを補足させて頂きますと、フルパス(\\■■■■■\■■\■■.xls)で入力している状態からファイル名(■■.xls)だけで検索ができるようにしたいという内容になります。

 
「検索」と言うのはどの様な動作をおっしゃっているのでしょうか?
・ファイル名(■■.xls) と同じファイル名の物を、ローカル(またはネットワークドライブ)から探し
  ファイルを開き、コードが記載してあるワークブックに張り付けたい
 
は判るのですが、そのファイル名は一意なのでしょうか?
 
考えられる場合分けとして
1. 特定のドライブまたは、フォルダ内に存在同一ファイルは1個しかないでしょう。
  そのドライブまたはフォルダは固定できるのですか?
 
   固定できるのであれば、
   ワークシート「First」の Cells(7,3) には 『■■.xls』のみを入力しておき
 
   Targetpath$ = First.Cells(7, 3).Value '検索対象のファイルパス
      ↓
   Targetpath$ = "\\■■■■■\■■\" & First.Cells(7, 3).Value '検索対象のファイルパス
 
   で良いのでは?
 
 
2. 指定したドライブまたはフォルダのサブフォルダに含まれる 同一ファイル名
   となったら、1個とは限らないです。
   この時、同一ファイル名のうち、コピー元となるファイルをどのように特定すればよいのですか?
 
   Ex. 同一ファイル名のうち、更新日付が最新のファイル

回答
投稿日時: 19/02/12 17:05:15
投稿者: WinArrow
投稿者のウェブサイトに移動

(1)セルに入っている「フルパス」から、「ファイル名」を求める方法
    Debug.Print Mid$(Targetpath,InStrRev(Targetpath,"\")+1)
 
 
(2)開いたブックから求める方法
    Debug.Print Origin.Parent.Name
 
 
 

投稿日時: 19/02/12 17:07:44
投稿者: taigernotora

引用:

「検索」と言うのはどの様な動作をおっしゃっているのでしょうか?

現在と同様に、ファイルを読み込むという動作です。説明が上手くできず申し訳ありません
 
引用:

そのファイル名は一意なのでしょうか?

一意です。
 
引用:

ドライブまたはフォルダは固定できるのですか?

固定はしないもので考えています。その代わりに読み込みファイルと同じフォルダ内で処理ができないという制約条件をつけたいと考えています。
 
引用:

同一ファイル名のうち、コピー元となるファイルをどのように特定すればよいのですか?

上記の制約条件をつけて同じフォルダ内でファイル名は一意としたいです。
 
説明が不足しており申し訳ありません。
お手数をおかけしますがお力添えよろしくお願いします。

回答
投稿日時: 19/02/12 18:28:38
投稿者: Suzu

マクロコードが書かれたファイルのフルパスは、ThisWorkBook.Path で取得できます。
 
ここから、最後の「\」の位置を取得する為には、
既に WinArrowさんが提示くださっている様に、 InStrRev関数を使えばよいです。
 
InStrRev(ThisWorkBook.Path ,"\",-1,vbBinaryCompare)「\」の最終位置を取得可能です。
 
そこに、LEFT関数を組み合わせ、
マクロコードが書かれたファイルのフォルダ位置を取得できます。

回答
投稿日時: 19/02/13 04:33:46
投稿者: もこな2

横からですが、
他にもFileSystemObjectを使うとか、split関数を使うとか手があるとおもうので、好みの方法を探るとよいかもです。
 
参考
http://officetanaka.net/excel/vba/tips/tips78.htm

回答
投稿日時: 19/02/13 04:40:49
投稿者: もこな2

Suzu さんの引用:
マクロコードが書かれたファイルのフルパスは、ThisWorkBook.Path で取得できます。
ただのタイプミスだとおもいますが、
 WorkBookオブジェクト.Path・・・・・・・親フォルダのパス
 WorkBookオブジェクト.Name・・・・・・・ブックの名前
 WorkBookオブジェクト.FullName・・・ブック(ファイル)のフルパス
ですよね?

回答
投稿日時: 19/02/13 06:33:19
投稿者: simple

> やりたいことを補足させて頂きますと、
> フルパス(\\■■■■■\■■\■■.xls)で入力している状態から
> ファイル名(■■.xls)だけで検索ができるようにしたいという内容になります。
 
原則は、フルパスを指定する必要があります。
 
ただし、その時点で
Windowsのカレントフォルダが、そのフォルダと同一であることが保証されているなら
ファイル名を与えるだけでも検索ができます。
 
しかし、操作によっては、カレントフォルダが変化することも考えられるので、
ファイルにアクセスする直前で、
(ChDriveや)ChDirを使って、フォルダ指定すれば安全です。
しかし、これは、手間を掛けることではほぼ同じとも言えます。
 
結局のところ、現実的に、
ファイル名だけを指定することにしたいのであれば、

・フォルダ部分は変わらないなら、それを Const値(定数)として持っておいて、
・それにファイル名を連結してフルパスにしたうえで、
・Workbooks.Openの引数にフルパスを渡してやる
というのが、間違いがない方法だと思います。

トピックに返信