• ベストアンサー
  • 暇なときにでも

「New」はつけた方がいいのでしょうか?

vbaなのですが、 FileSystemObjectでドライブの情報を取得したりファイル操作をしているのですが FileSystemObjectを宣言する時は、 Dim myFSO As New FileSystemObject にしたほうがいいのか、 Dim myFSO As FileSystemObject でいいのか教えてください. Sub Sample() Dim myFSO As New FileSystemObject Dim Drv As Variant Dim buf As String Set myFSO = CreateObject("Scripting.FileSystemObject") For Each Drv In myFSO.Drives Debug.Print Drv.DriveLetter Next Drv Set myFSO = Nothing End Sub 上記のコードは、newを付けても付けなくても結果は変わりませんでした。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数269
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

Dim myFSO As New FileSystemObject (Dim myFSO As FileSystemObject) の後で Set myFSO = CreateObject("Scripting.FileSystemObject") をやってるんだから、そりゃ結果は変わらないわなぁ... 結果的に、同じ事をやってるんだから。 CreateObjectとNewについて、もうちょっと勉強してみましょう。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございました。

関連するQ&A

  • Cドライブの全体の容量を取得する

    Cドライブの全体の容量を取得するVBAコードを実行したいのですが その結果をGBで取得したいのですが これだと実際の容量と一致しません。 何処が変ですか? Sub Sample() Dim myFSO As Scripting.FileSystemObject Set myFSO = New Scripting.FileSystemObject Debug.Print myFSO.Drives.Item("C").TotalSize / 1024 / 1024 / 1024 & "GB" End Sub

  • バイトをGBにするには?

    Sub FSO() Dim myFSO As Scripting.FileSystemObject Set myFSO = New Scripting.FileSystemObject Debug.Print myFSO.Drives.Item("C").TotalSize & "バイト" End Sub でバイトで容量を取得できるのですが、 単位をGBにするにはどうすればいいですか? Debug.Print myFSO.Drives.Item("C").TotalSize / 1024000000 & "GB" これであってるのでしょうか?

  • VBA SFO C:\Windows

    Cドライブには、 IntelもWindowsのどちらのフォルダも存在するのに Sub Sample() Dim myFSO As Object Debug.Print CreateObject("scripting.filesystemobject").GetFolder("C:\Intel").Size Debug.Print CreateObject("scripting.filesystemobject").GetFolder("C:\Windows").Size Set myFSO = Nothing End Sub をVBAで実行すると \Windows の方だけエラーになります。 エラー内容は 実行時エラー 70 書き込みできません。 です。 何故でしょうか?

その他の回答 (2)

  • 回答No.3

Dim myFSO As New FileSystemObject としているという事は、Microsoft Scripting Runtimeに参照設定されているのでしょう。 一方、Set myFSO = CreateObject("Scripting.FileSystemObject")は、Microsoft Scripting Runtimeに参照設定しないときの使い方です。今回のコードでは、宣言部でNewを入れてあれば、この部分(Set myFSO = 云々)はコメントアウトしても動作します。 参照設定しているときは、 Dim myFSO As New FileSystemObject 単独 または、 Dim myFSO As FileSystemObject と、 Set myFSO = New FileSystemObjectを併用するのが本来です。 これは、#1さんも仰っている事ですね。 敢えてしゃしゃり出たのは、最近 Dim myFSO As New FileSystemObject の書き方で酷い目にあったからです。 #2さんの >このキーワードを指定すると、オブジェクトを暗黙的に作成できます。 >オブジェクト変数を宣言するときにキーワード New を指定した場合は、 >オブジェクトを最初に参照したときにオブジェクトの新しいインスタンスが作成されるので だけでは無くて、 コードの中でオブジェクトを削除してしまった時は、新たなインスタンスが作成されます。 当方誤って消してしまっていたのに、真っ新な新規インスタンスが生成されてしまっていて、バグに気がつくのにずいぶん時間がかかってしまいました。 Dim ... As New は、二度と使うまいと、心に誓ったのでした。 ご参考まで。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございました。

  • 回答No.2
  • okormazd
  • ベストアンサー率50% (1224/2411)

Excel ヘルプ 「Dim」から、 New 省略可能です。このキーワードを指定すると、オブジェクトを暗黙的に作成できます。オブジェクト変数を宣言するときにキーワード New を指定した場合は、オブジェクトを最初に参照したときにオブジェクトの新しいインスタンスが作成されるので、Set ステートメントを使ってオブジェクトへの参照を代入する必要はありません。キーワード New を使って、固有のデータ型の変数の宣言、または従属オブジェクトのインスタンスの宣言はできません。また、キーワード New は、キーワード WithEvents と共に使用できません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございました。

関連するQ&A

  • 10分おきに自動でバックアップファイルを作成する

    エクセルファイルで 「10分おきに自動でバックアップファイルを作成する」 ということは可能ですか? Sub バックアップ作成() Dim myFSO As Object Dim MyFile As Object Dim WSH As Variant Dim strdate As String Set myFSO = CreateObject("Scripting.FileSystemObject") Set WSH = CreateObject("Wscript.Shell") strdate = Format(Now, "yyyy年mm月dd日hh時mm分") myFSO.CopyFile ActiveWorkbook.FullName, "D:\backup\" & strdate & ".xlsm" Set MyFile = Nothing Set myFSO = Nothing Set WSH = Nothing End Sub これでバックアップは作成できるのですが 「10おきに」というのはどうすればいいのでしょうか?

  • 実行時エラー 76 パスが見つかりません。

    VBAのFileSystemObjectでフォルダをコピーしているのですが フォルダ1は問題なくコピーできるのですが 毎回フォルダ2だけは、 実行時エラー 76 パスが見つかりません。 と言うエラーになってしまいます。 Sub Sample() Dim myFSO As Object Dim MyPath As String MyPath = "C:\" Set myFSO = CreateObject("Scripting.FileSystemObject") myFSO.CopyFolder MyPath & "フォルダ2", MyPath & "新フォルダ2" Set myFSO = Nothing End Sub このようなコードなのですが、フォルダ1もフォルダ2も同じコードを使っています。 フォルダ2に関しては容量が10GBくらいありますが、フォルダが重すぎるのが原因でしょうか?

  • VBA 一つのフォルダの中のフォルダ名とファイル名

    一つのフォルダの中のフォルダ名とファイル名を取得したい場合は ************************************** Sub test() Dim MyFileName As String Dim MyFolderName As String Dim myFSO As Object Dim MyFolder As Scripting.Folder MyFolderName = "C:\" 'フォルダを取得 MyFileName = Dir(MyFolderName & "*.*") Do While MyFileName <> "" Debug.Print MyFileName MyFileName = Dir() Loop 'ファイルを取得 Set myFSO = CreateObject("Scripting.FileSystemObject") With myFSO With .GetFolder(MyFolderName) For Each MyFolder In .SubFolders Debug.Print MyFolder.Name Next End With End With Set myFSO = Nothing End Sub ************************************** の様に ファイル名・フォルダ名をそれぞれループして取得しないとダメでしょうか? もうちょっとスマートなコードはありますか?

  • 位置の指定をすることは可能ですか?

    VBAでテキストファイルを生成するコードを作ったのですが その際位置の指定をすることは可能ですか? Sub test() Dim myFSO As New FileSystemObject Dim ts As TextStream Dim MyFileName As String Dim MyPath As String MyPath = MyDesktop & "\" MyFileName = "test.txt" Set myFSO = CreateObject("Scripting.FileSystemObject") Set ts = myFSO.CreateTextFile(MyPath & MyFileName, True) CreateObject("Shell.Application").ShellExecute MyPath & MyFileName 'ここで位置の指定をしたい Set ts = Nothing Set myFSO = Nothing End Sub こんな感じのコードは作成しました。 With MyFileName .Top = 100 .Left = 100 End With みたいな感じで位置の指定は可能ですか? APIを使わないと無理ですか?

  • フォルダをコピー フォルダの中に入れたい FSO

    vbaです。よろしくお願いします。 Sub Sample() Dim myFSO As Object Dim MyPath As String MyPath = "C:\Users\ああああ\Desktop\" Set myFSO = CreateObject("Scripting.FileSystemObject") myFSO.CopyFolder MyPath & "コピーしたフォルダーを入れるフォルダー", MyPath & "コピーするフォルダ" Set myFSO = Nothing End Sub こんな感じで、デスクトップにある、"コピーするフォルダ"をコピーして、 デスクトップにある、"コピーしたフォルダーを入れるフォルダー"の中に入れたいのですが 上記のコードを実行しても何も起きません。 コピーしたフォルダーを入れるフォルダーの中身を見ても、空です。 ”コピーしたフォルダーを入れるフォルダー”の中に、"コピーするフォルダ" を入れる方法を教えてください。

  • エクセルマクロでフォルダのコピーがしたい

    こんにちわ 色々調べてフォルダのコピーはできたのですが、色々いじっていて分からないことが出てきたので質問に来ました。 やりたいことはフォルダをコピーしたいのですが、それぞれ名前を自動で変えようと思い下記(1)を元に下記(2)を作ってみましたが、動きませんでした。 (1)いくつかのサイトを見て動いたマクロ sub test() Dim myFSO As New FileSystemObject myFSO.CopyFolder "C:\test", "C:\test2" End Sub (2)ちょっといじって動かないマクロ sub test() Dim myFSO As New FileSystemObject Dim name As String Dim name2 As String name = "C:\test" name2 = "C:\test2" myFSO.CopyFolder "name", "name2" End Sub 「パスが見つかりません」と出てきたので、読み込んでいないのだとは思うのですが、どうしたら動くかアドバイスをいただきたいです。 よろしくお願いします。

  • FSOでエクセルファイルを作成したい

    FSOでエクセルファイルを作成したいのですが、 ファイルの作成はできますが、作成したファイルが開けません。 Sub 新規Excelファイルを作成する() Dim MyFile As String Dim myFSO As Object MyFile = "管理簿.xlsx" Set myFSO = CreateObject("Scripting.FileSystemObject") With myFSO.CreateTextFile("C:\" & MyFile) .Close End With Set myFSO = Nothing End Sub で、エラーにならずうまくいっています。 が、その出来上がったファイルを開こうとすると 「ファイル形式またはファイル拡張子が正しくありません」 と言う旨のメッセージが表示されます。 何が間違ってますか? よろしくお願いします。

  • エクセルならうまく行くのですがアクセスだとエラーに

    エクセルならうまく行くのですがアクセスだとエラーになるのですがなぜでしょうか? フォルダに入ってるフォルダ名を全て取得して一つにつなげたいのですが Sub フォルダ名を取得() 参照設定:Microsoft Scripting Runtime Dim MyFSO As Object Dim MyGetFolder As String Dim MyFolderName As String Dim MyFolder As Folder Dim i As Long MyGetFolder = "D:\My Documents" Set MyFSO = CreateObject("Scripting.FileSystemObject") With MyFSO With .GetFolder(MyGetFolder) For Each MyFolder In .SubFolders MyFolderName = MyFolderName & "," & MyFolder.Name Next End With End With MsgBox MyFolderName Set MyFSO = Nothing End Sub これを実行するとアクセスだと For Each MyFolder In .SubFolders で、実行時エラー13 型が一致しません。 になります。 エクセルもアクセスも参照設定:Microsoft Scripting Runtimeにチェックを入れています。 コードはネットで拾ってきたコードです。 オフィスの種類は2003・OSはXPです。

  • vbaで参照設定する方法

    sub フォルダをコピーする() Dim myFSO As New FileSystemObject myFSO.CopyFolder "D:\TEST", "D:\TEST2" End Sub を実行したいのですが、 Visual Basic Editor の [ツール]-[参照設定] で、 "Microsoft Scripting Runtime" にチェックせずに、 vbaで参照設定する方法を教えてください。 バージョンは2007です。 ご回答よろしくお願いします。

  • ExcelVBAマクロについて確認させてください。

    ExcelVBAマクロについて確認させてください。 テキストファイル内の全ての文字を読み込むプログラムですが、テキストファイルがUTF-8形式の場合は文字化けしてしまいます。 UTF-8形式の場合でも読み込める方法はありますでしょうか。 お手数おかけしますが、よろしくお願いします。 Sub test() Dim FSO As Object, buf As String Set FSO = CreateObject("Scripting.FileSystemObject") ''C:\Work\Sample.txtの全ての文字を読み込んで表示します With FSO.GetFile("C:\Work\Sample.txt").OpenAsTextStream buf = .ReadAll MsgBox buf .Close End With Set FSO = Nothing End Sub