ファイルサーバー上にあるEXCELファイルのVBAで
新規にファイルを作成する際にDIR関数で
同名ファイルの有無チェックを作成したいと考えています。
しかし以下のような処理で行うとチェックするフォルダが
My documentsになってしまいファイルの有無チェックが
うまくいきません。どのように書けば良いのでしょうか?
ご教授ください。よろしくお願いします。
(情報不足でしたらご指摘ください。補足いたします)

ChDir "\\サーバー\フォルダ\サブフォルダ"
If(""=Dir(ファイル名))then '同名ファイル無
ファイルを保存する処理
Else
msgbox "同名ファイルがあります"
Endif

環境:
サーバー  :WinNT4.0
クライアント:Win98SE or WinNT4.0
EXCEL2000
LAN接続(同一ドメイン)

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

A 回答 (2件)

こんにちは。

maruru01です。

チェックするフォルダも込みのフルパスで指定する方がいいと思いますよ。
チェックするフォルダは、常に同じなら定数化しておき、変更の可能性があるなら変数に代入して使用すればいいでしょう。
変数(または定数)は標準モジュールにでも宣言しておけばいいでしょう。

*****標準モジュール*****
Public FolderName As String

*****実際の処理*****
FolderName = "\\サーバー\フォルダ\サブフォルダ\"
If Dir(FolderName & "ファイル名") = "" Then '同名ファイル無
  'ファイルを保存する処理
Else
  MsgBox "同名ファイルがあります"
End If
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
なるほど、フォルダを変数に代入しておけば
それの変更があった場合でも便利ですね。
勉強になりました。
ありがとうございます。

お礼日時:2002/08/26 13:57

ChDirとDir関数が調べるフォルダは関係ないと思います。


If(""=Dir("\\サーバー\フォルダ\サブフォルダ\ファイル名"))then 

など、Dir関数の引数にパスとファイル名を直接書けばよいのではないでしょうか。
そのように使ったことがあります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご指摘の方法にしたらできました。
Dir関数でパスとファイル名を
直接書けばいいとは気づきませんでした。
勉強になりました。

お礼日時:2002/08/26 13:52

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

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

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

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

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

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

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

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....続きを読む

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QDIR関数

VB6で、あるフォルダ(A)に存在するCSVファイル(複数ファイル)が、別のフォルダ(B)に存在しているかチェックを行いたいのでうが、DIR関数を2重に使用すると、フォルダAの次への読み込み時にエラーになってしまいます。
何か別の方法はあるのでしょうか?

Aベストアンサー

Q、何か別の方法はあるのでしょうか?
A、あります。

DIR関数を使わないとすれば、FileSystemObject になります。
Microsoft Scripting Runtime を参照させる必要があります。

Private Sub コマンド0_Click()
  Dim I  As Integer
  Dim N  As Integer
  Dim F() As String
  
  F() = GetFileList("C:\Temp")
  N = UBound(F())
  For I = 1 To N
    Debug.Print F(I)
  Next I
End Sub

[イミディエイト]
Test.txt
TestII.txt
TestNew.txt
Text.ini
Text.txt
取引先マスター.csv
夫婦.txt

このように GetFileList 関数を作成すれば一発で Dir 結果を取得できます。

[イミディエイト]
? FileExists("C:\Temp\Test.txt")
True

このように FileExists 関数を作成すれば一発で有り・無しも調べることが可能です。

Public Function GetFileList(ByVal strDir As String, _
              Optional strName As String = "*") As String()
On Error GoTo Err_GetFileList
   Dim strFiles As String
   Dim fso   As FileSystemObject
   Dim fol   As Folder
   Dim fil   As File
   Dim fils   As Files
  
   Set fso = New FileSystemObject
   Set fol = fso.GetFolder(strDir)
   Set fils = fol.Files
   For Each fil In fils
     If fil.Name Like strName And fil.Attributes = Archive Then
       strFiles = strFiles & "," & fil.Name
     End If
   Next
Exit_GetFileList:
On Error Resume Next
  GetFileList = Split(Mid(strFiles, 2), ",")
  Exit Function
Err_GetFileList:
  strFiles = ""
  MsgBox Err.Description & "(GetFileList)", vbExclamation, " 関数エラーメッセージ"
  Resume Exit_GetFileList
End Function

Public Function FileExists(ByVal FileName As String) As Boolean
  Dim fso As FileSystemObject
  
  Set fso = New FileSystemObject
  FileExists = fso.FileExists(FileName)
End Function

Q、何か別の方法はあるのでしょうか?
A、あります。

DIR関数を使わないとすれば、FileSystemObject になります。
Microsoft Scripting Runtime を参照させる必要があります。

Private Sub コマンド0_Click()
  Dim I  As Integer
  Dim N  As Integer
  Dim F() As String
  
  F() = GetFileList("C:\Temp")
  N = UBound(F())
  For I = 1 To N
    Debug.Print F(I)
  Next I
End Sub

[イミディエイト]
Test.txt
TestII.txt
TestNew.txt
Text.ini
Text.txt...続きを読む

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QExcelでの Dir

excel VBAにて Dir関数を用いて、フォルダに存在するファイルを
つかむのに、下記のスクリプトがあります。(渡辺ひかる氏のサンプル集)。
質問は、このスクリプトで引っ張り出されるファイルの順番です。本を色々調べたのですが、順番は、「不明」とあります。
しかし、現実は、アルファベット順? に並んでいるように思われます。 本当のところは、どうなんでしょう?
「不明」なのか、それとも「順番が成立している」のか?
よろしくお願いします。
----------------------------------------
Option Explicit
Sub P_Sample003()
Dim myPath As String
Dim myFileName As String
Dim i As Long
myPath = ThisWorkbook.Path & "\" '任意のフォルダ
myFileName = Dir(myPath, 0)
Do While Len(myFileName) > 0
Debug.Print myPath & myFileName
myFileName = Dir()
Loop
End Sub

excel VBAにて Dir関数を用いて、フォルダに存在するファイルを
つかむのに、下記のスクリプトがあります。(渡辺ひかる氏のサンプル集)。
質問は、このスクリプトで引っ張り出されるファイルの順番です。本を色々調べたのですが、順番は、「不明」とあります。
しかし、現実は、アルファベット順? に並んでいるように思われます。 本当のところは、どうなんでしょう?
「不明」なのか、それとも「順番が成立している」のか?
よろしくお願いします。
----------------------------------------
Option...続きを読む

Aベストアンサー

こんばんは。

少なくとも、Office TANAKAの田中氏の書いている内容は、今となっては疑問ですね。
「FATに書き込まれた順番か」ということですが、それは以前のWin98の頃のものではないでしょうか。今、多くのユーザーは、NTFSであるし、その取り出す順番というのは、試してみると、「一応の」アルファベット順(Unicode順)に出てくるのではないでしょうか?

参考:
http://blogs.msdn.com/oldnewthing/archive/2005/06/17/430194.aspx

アルファベット順はともかく、その後の2バイト文字の状態を以下のコードで結果を調べてみました。

Sub Sample20a()
  Dim buf As String, i As Long
  buf = Dir("*.*")
  Do While buf <> ""
    If LenB(StrConv(Left(buf, 1), vbFromUnicode)) > 1 Then
    i = i + 1
    Worksheets("Sheet1").Cells(i, 1) = buf
    If i > 100 Then Exit Do
    End If
    buf = Dir()
    
  Loop
End Sub

1 バイト 文字は、1バイト文字でソートされ、2バイト文字は、2バイト文字で、Unicode 順にソートされますから、

msdn にある
× U+00D7 Multiplication sign (掛け算の印)
は、2バイト側の先頭に出てきます。文字コードをチェックすると、Unicode で、D7 ですが、=CODE(A1) -- [JIS] でみると、8543になっています。

調べた限りでは、それに矛盾は生じていません。

こんばんは。

少なくとも、Office TANAKAの田中氏の書いている内容は、今となっては疑問ですね。
「FATに書き込まれた順番か」ということですが、それは以前のWin98の頃のものではないでしょうか。今、多くのユーザーは、NTFSであるし、その取り出す順番というのは、試してみると、「一応の」アルファベット順(Unicode順)に出てくるのではないでしょうか?

参考:
http://blogs.msdn.com/oldnewthing/archive/2005/06/17/430194.aspx

アルファベット順はともかく、その後の2バイト文字の状態を以下のコ...続きを読む

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

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

Aベストアンサー

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

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

QVBA ネットワーク上のファイルでカレントフォルダを取得するには?

VBA ネットワーク上のファイルでカレントフォルダを取得するには?

VBA超初心者でネットで色々調べて、ところどころコピーしながらプログラムを作っています。
ローカルのPCでは問題なく動くまでになったのですが、実際にはネットワーク上の共有サーバで実行したいのですが、ネットワーク上ではカレントパスがうまく設定できていないようで、動きません。

CreateObject("WScript.Shell").CurrentDirectory = ThisWorkbook.Path

というコードでVBAが置いてあるフォルダをカレントディレクトリに設定するようにしています。

どのようにしたらネットワークサーバで動くようになりますか?

Aベストアンサー

WebDAVの環境がないため、関連のありそうな情報をあたってみました。
もしかすると、OSの機能で制限されているかもしれません。

http://heipooh.jugem.jp/?eid=56

VBAではなく、直接手動操作で設定した時にはどうでしょうか?
できないとなると、何らかの環境設定が必要なのではないでしょうか?
上記URLの操作では、エクスプローラからネットワークドライブとして認識させています。

EXCELの機能については、下記URLの「カレントドライブとカレントフォルダ」をご参照ください。
http://officetanaka.net/excel/vba/tips/tips91.htm

現状のネットワーク構成ですと、カレントディレクトリの前に、カレントドライブを認識し得る環境がないと推察されます。

取得する方法について、他もあたってみて、情報が見つかりましたら投稿致します。


人気Q&Aランキング

おすすめ情報