ちょっと変わったマニアな作品が集結

ActiveWorkbook.Pathでパス名を取得して、
同じフォルダ内の別のエクセルシートを開きたいのですが、
見つかりませんと、エラーになります。

ただしそのエクセルを直接開いて名前を付けて同名で上書き保存をすると
取得できるようになるのですが、

すべて閉じて、再度実行すると、また取得できなくなるという現象が起こっているのですが
毎回上書き保存するわけにいかない為
何かよい方法はありますでしょうか?

-----------------------------------
Dim strPath As String
Dim strBookName As String

strPath = ActiveWorkbook.Path
strBookName = Dir(strPath & "\管理簿.xlsm") 'ファイル名取得

On Error GoTo myError

Workbooks.Open FileName:=strBookName

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんにちは。

お邪魔します。
ちょっと気になっていたのですが、
 ActiveWorkbook

 Dir()関数
の使い方は意図に合っているものでしょうか。
ThisWorkbook に換えて、Dir()関数にワイルドカード付けてみたら、
よく見かけるニーズの多い記述だったりするのですけれど。
とりあえず、自Bookの在るフォルダにある".xlsm"ファイルを
総なめにしてイミディエイトウィンドウ
(VBE画面から、Ctrl + G キーを押すとアクティブになるウィンドウのことです)
に表示するものを揚げてみます。
一度、確認した方がよいかと思いましたので。

Sub Re7742919chk()
  Dim strPath As String
  Dim strPathName As String
  Dim strBookName As String
  
  strPath = ThisWorkbook.Path
  strPathName = strPath & "\*.xlsm"
  strBookName = Dir(strPathName)
  Debug.Print strPathName: Debug.Print , strBookName
  Do While strBookName <> ""
    Debug.Print , strBookName
    strBookName = Dir()
  Loop
End Sub

次いで、
  strPathName = strPath & "\*.xlsm"
を、
  strPathName = strPath & "\管理簿*.xlsm"
  strPathName = strPath & "\*管理簿.xlsm"
  strPathName = strPath & "\*管理簿*.xlsm"
などに代えて試してみては如何でしょう。

> ただしそのエクセルを直接開いて名前を付けて同名で上書き保存をすると
> 取得できるようになるのですが、
元コードについては、
実行する度に、アクティブなブックが異なっていたとして
それぞれが異なるフォルダにあるブックだった場合に、
見かけ上、同じような現象が再現できますので、
その確認、ということです。
    • good
    • 0

管理簿.xlsmファイルは実在しますか?拡張子がxlsxだったりxlsだったりしませんか?



'Pathで\記号を連結する場合は、.を前置すると良いですよ。
strBookName = Dir(strPath & ".\" & ActiveWorkbook.Name) 'ファイル名を取得する試験
で動作するはずですよね。

> strPath = ActiveWorkbook.Path
は、想定どおりの値を取得できてますか?MsgBoxか、Debug.Printで確認できます。
    • good
    • 1
この回答へのお礼

ファイルも実在し、MsgBoxでパスの名前もファイル名も確認したところ、
ちゃんと、パスもファイル名も持ってきていましたが、
やはり、エラーになってしまい、
原因がよくわからないので、
直接フルパスを書き込む方法に変更しました。
回答ありがとうございました。またよろしくお願いします。

お礼日時:2012/10/12 10:01

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcel2010VBAでエラーが出る相対パス指定

 ExcelVBAで,Excel2007と2013で問題無いのに,
Excel2010ではエラーが出る相対パス指定について,
ご教示を頂けると助かります.

 ExcelVBAにて,
○○.dll ファイルを 以下のように宣言して使っています.

Private Declare Function LoadTT Lib ".\○○.dll" _
() As Integer

 プログラムの中で,
ret = LoadTT()
を実行すると,
Excel 2007では相対パスでの指定で問題無く動作しますが,
Excel 2010では相対パスでの指定ではエラー(ファイルが見つからない)"48"が出ます.
そこで,相対パス指定をやめて絶対パスに変更すると問題無く動作します.

 念のため Excel2013でも試したところ,
2007と同様に,相対パス指定でも問題なく動作しました.

 なお,ExcelVBAのファイル「○.xlsm」と「○○.dll」は同じフォルダーに入れています.
 また,
ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
の実行によるカレントフォルダーの確認も,どのバージョンでも同じに正しく確認出来ています.
 
 因みに,バージョンの違う各Excelは別々のPCでの動作ですが,使用OSは Windows7 Professional 32bit で同じです.

 以上のように
Excel2010だけ動作が異なります.

 とりあえずは絶対パス指定にすれば問題は解消するのですが,
Excel2010で特に何か設定したということは無いので気持ち悪く,
原因と思われることでご存じ方がいらしたらご教示を頂けると助かります.

 どうぞよろしくお願い致します.

==

 ExcelVBAで,Excel2007と2013で問題無いのに,
Excel2010ではエラーが出る相対パス指定について,
ご教示を頂けると助かります.

 ExcelVBAにて,
○○.dll ファイルを 以下のように宣言して使っています.

Private Declare Function LoadTT Lib ".\○○.dll" _
() As Integer

 プログラムの中で,
ret = LoadTT()
を実行すると,
Excel 2007では相対パスでの指定で問題無く動作しますが,
Excel 2010では相対パスでの指定ではエラー(ファイルが見つからない)"48"が出ます.
そこで,相対パス指定をやめて...続きを読む

Aベストアンサー

#2の回答者です。

質問者さんは、もう論理的な対処をしたり、回答者の書いた内容の確認もないようです。そこで、後の人のためにまとめておこうと思い立ちました。

----------------
 [.dll] は、[.ocx]に読み替えても可

(1)一般的な.dll (ダイナミックリンク・ライブラリ)は、一般的には、実行ファイル(.exe)や WindowsのSystem32 フォルダに入れる。
 基本はこの通り
 http://www.forest.impress.co.jp/info/knowledge/2-5-3xp.html

(2).dllは、パスの通った所に置く。
 - Shellコマンド(SET PATH)や外部オブジェクト(FileSystemObjectのBuildPath)で、パスは通せる。

(3).dllを絶対パスにする。

(4) Excel 等のOfficeの場合は、設定で、[オプション]-[保存]-[規定のファイル]
で、Current Folder を決め、そこに置く。 要 Excelの再起動。
(非推奨-ファイルと同じ場所に置くことは、ユーザーによる削除したり移動したりするトラブルが想定されるから。)

(5)相対パスは、基本的にはお勧めできない。

過去には、このような例もある。ただし、質問者のExcel VBAの技術としてはかなり低い。
通常、ユーザーが作成したライブラリであっても、当時はMS Officeのディベロッパのユーティリティや現在でも流通しているフリーのインストーラーを使うのが基本だから、そのような問題は本来は発生しない。単なる手続き上の手抜きによるトラブル。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=5215;id=excel

 ChDrive ActiveWorkbook.Path
 ChDir ActiveWorkbook.Path
が可能と書いてあるが、私自身は、Win32 APIのSetCurrentDirectory をお勧めする。
---------------------

と、以上が、32ビットでの一般的な対処法です。他にも、Excelの特殊なツールによって、設定を変える方法はあるかとは思いますが、基本的なことは変わらないと信じます。自作で、Excel用のライブラリを作れるレベルなら、このような質問はしないはずです。いたずらに、長く話を伸ばしてもしかたがないので、これで終わりにします。

#2の回答者です。

質問者さんは、もう論理的な対処をしたり、回答者の書いた内容の確認もないようです。そこで、後の人のためにまとめておこうと思い立ちました。

----------------
 [.dll] は、[.ocx]に読み替えても可

(1)一般的な.dll (ダイナミックリンク・ライブラリ)は、一般的には、実行ファイル(.exe)や WindowsのSystem32 フォルダに入れる。
 基本はこの通り
 http://www.forest.impress.co.jp/info/knowledge/2-5-3xp.html

(2).dllは、パスの通った所に置く。
 - Shellコマンド(SET PATH)や...続きを読む

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXcelのマクロで相対パスでファイルを開く

Excelでマクロを使って他のブックを開こうとしています。
同じフォルダ内のブックを開くには
Workbooks.Open Filename:=ThisWorkbook.Path & "\ブック名.xls"
で開く事が出来たのですが、一つ上の階層にあるブックを開きたいときはどのようなコマンドを使えば良いのでしょうか??

お教え下さい。

Aベストアンサー

Workbooks.Open Filename:=ThisWorkbook.Path & "\..\ブック名.xls"

フォルダ名「..」で親フォルダを参照できます。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCELのVBAでのSelectとActivateの違い

VBAの初心者です。
ExcelのVBAでメッセージを表示してシートを切換えるというのを作りたいのです。
見真似で作成したのが↓です。


Dim rtn As String
rtn = MsgBox("シートを切換えますか", vbYesNo, "シートの切替")
If rtn = vbYes Then
Worksheets("送付先一覧").Activate
Range("a1").Select

Else
Exit Sub
End If

動作確認はできましたが、上記の「Activate」を「Select」に変更しても特に動作異常がありません。
そこで、疑問ですが、「Activate」と「Select」ってどうやって使い分けるのでしょうか?

Aベストアンサー

こんにちは。

通常は、シートもセルも Select でよいと思います。
選択して、扱えるようにするということだと思います。

#2さんも述べておりますが、Activate って、ひとつを選ぶことですね。でも、なぜか、Activate は、ほとんど使いません。

たぶん、Select は、選択した後に、その選択したものを、そのままオブジェクトとして確保して使えるので便利だから選ばれるのかもしれません。

Select → Selection
として使えます。

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む

Qエクセル マクロで指定フォルダを開く

エクセルにて
指定フォルダを開く、マクロがあれば教えて頂けないでしょうか。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

こういうものですか?
開くフォルダを変えたいときは targ に与えるパスを変更します。

Sub OpenFolders()
Dim targ As String
targ = "C:\"
Shell "C:\Windows\Explorer.exe " & targ, vbNormalFocus
End Sub


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング