• ベストアンサー

フォルダ内のファイルをランダムに取り出したい

VB6です。 イベントで、選んだフォルダ内の音源ファイルをランダムに鳴らすコードを書きました。 Dim MusPath As String Dim n As Integer Dim sou As String File1.Pattern = "*.*": n = File1.ListCount Randomize sou = Int(Rnd * n) + 1 MusPath = File1.path + IIf(Right(File1.path, 1) = "\", "", "\") + sou + ".wav" 以下略 一見しておわかりの通り、該当するフォルダ内のファイル名は1~nまでの連番でなければいけません。 これを発展させて、曲名のついたファイルが不定数格納されているフォルダからランダムに一曲取り出すようなプログラムを作りたいと思っていますが、MSDNライブラリとか見てもイマイチよくわかりません。 お教えいただければ幸いです。 よろしくお願いします。

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

  • ベストアンサー
  • unamana19
  • ベストアンサー率62% (56/89)
回答No.2

ここまでできているなら、 File1.List(sou - 1)で、ファイル名が取得できますね。

cs-megami
質問者

お礼

できました! 意外と簡単なことだったんですね。 すぐ近くにあるものを探し回っていたみたいで、恥ずかしいです^^; ありがとうございました。

その他の回答 (1)

noname#39970
noname#39970
回答No.1

ファイル名一覧を配列に格納 該当フォルダ内のファイル数を用いて乱数発生を行い 該当配列からファイル名を取り出す

cs-megami
質問者

お礼

#2さんの助言で解決しましたが、この方法も勉強のために試してみたいと思います。 ありがとうございました。

関連するQ&A

  • ExcelVBAでフォルダーからファルイ名を書き出しリンクを貼り、表示名を変える

    下記のようなVBAをつくったのですがうまく行きません。 Option Explicit Dim ドライブ As String Dim フォルダ As String Dim 拡張子 As String Dim 記入シート As String Dim パス As String Dim ファイル名 As String Dim ディスプレイ As String  Dim 貼付行 As Integer Dim ハイパーリンク As String Dim strVal As Variant 'Sub フォルダ中のファイル名をシートに書く() ドライブ = "C" 'ドライブを指定する フォルダ = "M.Co,\My Documents" 拡張子 = "*." & "JPG" 記入シート = "ファイル一覧" End Sub Private Sub 指定フォルダ中の指定拡張子のファイル名をシートに書く() Sheets(記入シート).Activate Cells.Clear 'すべてクリア Range("A1").Select パス = ドライブ & ":\" & フォルダ & "\" 'パスを組む ファイル名 = Dir(パス & 拡張子) strVal = Dir(パス & 拡張子) (1)ディスプレイ = Left(strVal, "SEARCH(""."",strVal)-1") 貼付行 = 0    Do While ファイル名 <> ""    貼付行 = 貼付行 + 1 Cells(貼付行, 1).Value = ファイル名 ActiveSheet.Hyperlinks.Add Anchor:=Cells(貼付行, 1), Address:=ファイル名, TextToDisplay:=ディスプレイ ファイル名 = Dir() '次のファイル名を取り出す Loop End Sub (1)がおかしいです。よろしくお願い致します。

  • フルパスからファイル名取得の方法

    指定したフォルダのフルパスを「bmpFiles」に入れているのですが、表示する時はファイル名のみの表示にしたくて「Path.GetFileName」を使用してファイル名を取得しようとしたのですが、「型'stringの1次元配列'の値を'string'に変換できません」というエラーが出てしまいます。 VBを始めたばかりでよく分からないのでアドバイスをお願いします。 Dim imageDir As String = fbd.SelectedPath ' 指定フォルダまでのディレクトリ Dim bmpFiles As String() = _ System.IO.Directory.GetFiles(imageDir, "*.bmp") 'フルパス Dim bmpFileName As String = _ Path.GetFileName(bmpFiles)  ←bmpFilesで上記エラー

  • サブフォルダ内のファイル名取得について

    Windows7 Access 2013環境です。 USB接続したハードディスク内のファイルリストを作成しようとしています。 ハードディスクはNTFSフォーマットです。 ボタン1をクリックしたとき、テーブル1をソースにしたフォーム1に ファイル名を書き出していくようにしました。 ドライブ内のサブフォルダを選択すると、プログラムは正常に作動するのですが ドライブ直下を指定すると、実行時エラー 70 "書き込みできません" が発生します。 NTFSのアクセス権は、管理者でログインしているので、システム関連のフォルダ System Volume Information $RECYCLE.BIN 以外は問題ありません。 どこに問題があるのでしょうか。もし、システム関連のフォルダが 引っかかっているとしたら、その回避方法についても 具体的にご教授願います。 ↓エラー箇所↓ -------------------------------------------------------------- For Each subfolder In folder.SubFolders -------------------------------------------------------------- ↓作成したプログラム↓ -------------------------------------------------------------- Private Sub ボタン_1_Click() Dim dlg As FileDialog Dim fold_path As String Dim strTargetDir As String DoCmd.GoToRecord acDataForm, "F0001_フォーム1", acNewRec Set dlg = Application.FileDialog(msoFileDialogFolderPicker) If dlg.Show = False Then Exit Sub fold_path = dlg.SelectedItems(1) strTargetDir = fold_path Call FolderSearch(strTargetDir) MsgBox "終了" Set dlg = Nothing Else End If End Sub Public Sub FolderSearch(strTargetDir As String) Dim fso As Object Dim folder As Object Dim subfolder As Object Dim file As Object Dim objFilsSys As Object Dim objDrive As Object Dim strDriveLetter As String Set fso = CreateObject("Scripting.FileSystemObject") Set folder = fso.GetFolder(strTargetDir) strDriveLetter = Left(strTargetDir, 1) Set objFileSys = CreateObject("Scripting.FileSystemObject") Set objDrive = objFileSys.GetDrive(strDriveLetter) For Each subfolder In folder.SubFolders  ←エラー箇所 FolderSearch subfolder.Path Next subfolder For Each file In folder.Files With file Me.ボリューム名 = objDrive.VolumeName Me.ファイル名 = file.Name Me.ファイルパス = folder.Path Me.ファイルサイズ = folder.Size DoCmd.GoToRecord acDataForm, "F0001_フォーム1", acNewRec End With Next file Set objDrive = Nothing Set fso = Nothing Set folder = Nothing End Sub

  • VB.NRT FolderBrowserDialogを使用して、選択したフォルダ内のファイルを表示させるには?

    VB.NET初心者です。 ネットで調べてFolderBrowserDialogを使用して、フォルダを表示させ、フォルダのパスを取得するところまではできたのですが、フォルダの中のファイルを表示させるには、どうしたらよいのでしょうか? OpenFileDialogクラスを使えば、ファイルは表示できるようですが、ファイルの入っているフォルダのパスだけ取ってきたい(複数ファイルを一度に読みこむため)のですが、何か良い手はありませんでしょうか? また、FolderBrowserDialog使用で前回選択したフォルダを次にダイアログを開いたときにも表示させることは可能でしょうか? よろしくお願いいたします。 Dim fbd As FolderBrowserDialog = New FolderBrowserDialog() fbd.Description = "フォルダを指定してください。" If fbd.ShowDialog() = DialogResult.OK Then Console.WriteLine(fbd.SelectedPath) End If Dim folder As String = fbd.SelectedPath Dim serchpattern As String = "*.txt" Dim files As New ArrayList 'フォルダ名格納 Get_FPath(folder, serchpattern, files) End Sub

  • フォルダの中にファイルがあるかどうかを読み取りたい

    vbaです。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Option Explicit Sub test() Dim 検索フォルダ As String Dim 検索ファイル名 As String 検索フォルダ = "C:\Users\Public" 検索ファイル名 = "新しいテキスト ドキュメント.txt" If 検索フォルダの中に検索ファイル名がある Then MsgBox 検索ファイル名 & "は存在します" End If End Sub ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ こんな感じで、フォルダの中にファイルがあるかどうかを読み取りたいのですが これ以上どういうコードを書けばいいかわかりません。 「フォルダの中にファイルがあるかどうか」がわかれば、出来そうな気がするのですが ご教授いただけますか?

  • マクロでセルをランダムに並び替えたい

    マクロ初心者です。 Sheet1のB4に1、B1003に1000 というように整数が小さい順番にセルに入力してあり、 Sheet2のB4からB1003までにそれらのセルをランダムに並べ換え、 さらにそれらのセルをSheet3のB4からB1003に大きい順(B4に1000、B1003に1といったように)に並び替えたいのですが、 どうすればいいでしょうか。 Sub 並び替え() Dim RndArr(999, 0) As Variant Dim i As Integer, c As Integer Dim rndTmp As Integer Randomize i = 0 RndArr(i, 0) = Int(1000 * Rnd) + 1 Do Re: rndTmp = Int(1000 * Rnd) + 1 For c = 0 To i If rndTmp = RndArr(c, 0) Then GoTo Re Next c i = i + 1 RndArr(i, 0) = rndTmp Loop Until i > 999 Range("b4.Sheet2", "b1003.Sheet2") = RndArr End Sub 今わかっている状況は上記の通りですが、 このマクロだと、セルを並び替えているのではなく乱数を当てはめているだけなので、 整数が重複してしまいます。 よろしくお願いします。

  • VBA フォルダ内のファイルを、ファイル名順に開く

    【PPT VBA】フォルダ内のファイルを、ファイル名順に開く方法について  今晩は、質問させていただきます。どうぞよろしくお願いいたします。  環境:Win7+PPT2007 になります。  下記のようなコードで、あるフォルダ内のファイル群のデータを取得しております。 「ファイル名順」でデータを取り出したいのですが、違う順(おそらく日時順)で 出てくるので悩んでいる次第でございます。  検索いたしておりますと、ハードディスク等の環境によって検出順が異なるようでございましたが 何か、良さそうな方法がございましたらお教えいただきたくお願いいたします。 Dim File_Collection As Object Dim File_List As Variant Dim Folder_Collection As Object Dim Folder_List As Variant Set File_Collection = CreateObject("Scripting.FileSystemObject") _ .GetFolder(パス).Files For Each File_List In File_Collection      '(名前順では検出してくれません。。。) Next  暫く考えまして、例えば Stringの配列を用意しておいて一旦、上記コードでファイル名とパスをリスト化 →配列の文字列を登り順に、Sort →これの順にファイルを開いていく などという事を思いつきました。しかしファイル数が多いため(100~500個でございます)、 これらの長いパスを配列に入れるというのも、メモリに負担がかかる(?)のかな などと考えている次第でございます。  他に、配列の代わりにエクセルを一旦開いて、そこでソート・・・・・とも考えましたが 友人達に使っていただく可能性があり、余りスマートな解決策ではなさそうですので それよりは上記の「配列でソート」を優先したい次第でございます。  コーディングで何か良い方法があれば良いのでございますが、 他の方法でも結構でございます。もし「自分なら、こうするかな」といった ようなご意見などございましたら是非、ご紹介いただけないでしょうか。  もしお詳しい方がいらっしゃいましたら,どうぞよろしくお願いいたします。

  • 乱数の発生 Randomizeを入れた方が良いのか

    VBAについて教えてください。 --------------------------- Sub Randomizeを入れた場合() Dim intMax As Integer Dim intMin As Integer Randomize intMin = 1 intMax = 10 Debug.Print Int((intMax - intMin + 1) * Rnd + intMin) End Sub --------------------------- Sub Randomizeを入れていない場合() Dim intMax As Integer Dim intMin As Integer intMin = 1 intMax = 10 Debug.Print Int((intMax - intMin + 1) * Rnd + intMin) End Sub --------------------------- 上記二つのマクロを実行しても 同じような結果が得られる気がするのですがRandomizeは必要なのでしょうか? 一つのサブプロシージャーの中で1回しか乱数を発生させないのなら Randomizeを使って乱数を初期化する必要はないのですか?

  • もしフォルダがなかったら作成するというコード

    エクセルvbaで、 フォルダA(FileA)の中のPDFファイル全部を、フォルダB(FileB)へコピーする というコードを作成しました。 が、パスが見つかりませんとエラーが出ます。 その理由は、移動先にフォルダがないからです。 フォルダがない場合は、フォルダを作成するというコードを入れたいのですが、 もしご存知の方いらっしゃいましたら、どうか教えてください。 エクセル2010dを使用しています。 vba初心者で、ここまでネット検索などで作りましたので、いびつかもしれません。 どうぞよろしくお願いいたします。 ---------------------------------- Sub CopyPDFwithFile() 'フォルダ内のPDFを全てAをBへコピー Dim objFileSys As Object Dim strScriptPath As String Dim strCopyFrom As String Dim strCopyTo As String Dim MaxRow As Integer Dim i As Long Dim k As Long Dim FileA, FileB As String n = Range("V6").Value MaxRow = ThisWorkbook.Sheets(n).Cells(11, 22).End(xlDown).Row For i = 1 To MaxRow - 10 FileA = Range("V" & i + 10).Value FileB = Range("W" & i + 10).Value Debug.Print FileA Debug.Print FileB Set objFileSys = CreateObject("Scripting.FileSystemObject") strScriptPath = ThisWorkbook.Path Debug.Print strScriptPath strCopyFrom = objFileSys.BuildPath(FileA, ".pdf") strCopyTo = objFileSys.BuildPath(FileB, "new\.pdf") objFileSys.CopyFile FileA & "\*.pdf", FileB  '←ここでエラー、ストップします Set objFileSys = Nothing                                Next i End Sub ---------------------------------------------

  • Active Basic フォルダの絶対パスの取得

    ファイルまでの絶対パスの取得のように、自分のフォルダまでのパスを取得するにはどうしたらいいのでしょうか? D:\aaaa\bbbb\cccc\dddd\abcd.exe があって、 D:\aaaa\bbbb\cccc\dddd\ を取得したいのですが・・・ 実験してみたのですが、上手くいきませんでした。 すみませんが、やり方をご教授ください。お願いします。 ↓頑張った証 '自分自身のファイルパスを取得する Dim path[MAX_PATH] As Byte Dim FileName As BytePtr Dim MaxFilePath As Long Dim MyFileName As Long Dim AllByte As Long Dim MidAns As String GetModuleFileName(NULL,path,MAX_PATH) 'ファイルパスからファイル名を抜き出し、その大きさを取得して、引く FileName=malloc(Len(path)+1) GetFileTitle(path,FileName,Len(path)+1) MaxFilePath=Len(path) MyFileName=Len(FileName)+1 AllByte=MaxFilePath-MyFileName 'フォルダまでのパスを抜き出す MidAns=Mid$(path,1,54) free(FileName)

専門家に質問してみよう