• ベストアンサー

Excel_Visual Basic Editorについて教えてください

お世話になります。 今、フォルダ名一覧を作るVBを作成しているのですが、フォルダ名一覧&セル内の文字区切りを同時に定義する事はできるでしょうか? 例えば、 MyDocuments内に”1111_aaaa_ああああ_20061030”という形でたくさんのフォルダがあります。フォルダがたくさんあるため、一覧にて管理したいと思います。それに伴い、一覧にしたフォルダ名を"_"(アンダーバー)で区切って2列目以降のセルに収めたいのですが。。。 (1)フォルダ名一覧(抽出)する方法・・・dir関数 (2)文字を分割する方法(1つのセルのみ)・・・Split関数 一応、上記のようにフォルダ名一覧抽出、文字区切り個々には定義できるのですが、合わせるとうまくいきません。2つ同時に定義する事は可能でしょうか?また、文字区切りをたくさんの行(1列目に入っているフォルダ名一覧全て)をいっぺんに実行したいです。 VBにあまり詳しくないため、教えてください。 よろしくお願いいたします。 【環境】 ・WindowsXP ・Excel2003

  • YJET
  • お礼率50% (4/8)

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

  • ベストアンサー
  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.3

すみません。フォルダというのを見落としていました。 先のサンプルをベースにすると、以下のような感じです。 Sub test() Dim wkdir As String Dim fname As String Dim spname As Variant Dim i As Integer Dim j As Integer wkdir = "c:\work\test\" fname = Dir(wkdir, vbDirectory) Do While fname <> "" If fname <> "." And fname <> ".." Then If (GetAttr(wkdir & fname) And vbDirectory) = vbDirectory Then i = i + 1 j = 0 spname = Split(fname, "_") For Each x In spname j = j + 1 Application.ActiveSheet.Cells(i, j) = x Next End If End If fname = Dir Loop End Sub ちなみに、Application.ActiveSheetを使っているので、シートがアクティブな状態で マクロを実行してください。 或いは、シート名が"Sheet1"なら次のようにしても良いです。 Application.ActiveSheet.Cells(i, j) = x のところを Sheets("Sheet1").Cells(i, j) = x とする。 ※あくまで例として提示していますので、そのまま使う前提では有りません。

YJET
質問者

お礼

ありがとうございました。 上記を参照し、行ったところ、正常に処理できました! 変更したコード↓ ******************************************************* Sub バックアップ一覧作成() '変数の宣言 Dim wkdir As String Dim fname As String Dim spname As Variant Dim i As Integer Dim j As Integer 'フォルダの場所指定 wkdir = "c:\GhostData\" fname = Dir(wkdir, vbDirectory) 'フォルダ名の取得 Do While fname <> "" If fname <> "." And fname <> ".." Then If (GetAttr(wkdir & fname) And vbDirectory) = vbDirectory Then i = i + 1 j = 0 'フォルダ名区切り(_) spname = Split(fname, "_") For Each x In spname j = j + 1 '実行するセル選択 Sheets("バックアップ一覧").Cells(i + 1, j) = x Next End If End If 'A列全てでフォルダ名区切り実行 fname = Dir Loop End Sub ******************************************************* 'で付けたコメントは合っていますでしょうか?

その他の回答 (5)

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.6

またまたすみません。コメント一箇所だけ訂正です。 'フォルダ名の取得 fname = Dir(wkdir, vbDirectory) になります。 ついでに以下も説明しておきます。 Do While fname <> "" 上記は、先に書いたように、取得したフォルダ名(fname)が空になるまで繰り返しです。 (loopまで) ついでに、下記ですが、 If fname <> "." And fname <> ".." Then フォルダ名を取得すると、"."カレントディレクトリと".."親ディレクトリも含まれますが これは無関係なので処理しないのということです。 If (GetAttr(wkdir & fname) And vbDirectory) = vbDirectory Then これは、取得したファイル名が「フォルダ」ならという条件です。 For Each x In spname これは、「_」で分解した配列がspnameなんですが、その配列要素が存在するだけ 処理を繰り返します。 だいたい、こんなところですね。

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.5

何度もすみません。 コメントですが、概ね意味はOKと思いますが、最後の 'A列全てでフォルダ名区切り実行 は '次のファイル名(フォルダ名)を取得 になると思います。 取得するファイル名が無くなると空値が返り、doループが終了します。 その前の、 '実行するセル選択 は、ニュアンス的には 'セルに「_」で区切られた文字列を順次セット の方が近いでしょうか。

YJET
質問者

お礼

コメントの確認ありがとうございました。 VBがあまり詳しくなく、頭を抱えていました。。 何度も何度も本当にありがとうございました。 また何かありましたら、よろしくお願いいたしますm(._.)m

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.4

補足への回答を忘れていました。 サンプルでシートにセットしているのは iが行、jが列を表し、補足の例でいうと A1を基点として A B C D 1234 5678 ああ 20061030 5678 1234 いい 20061031 という風になります。 更に下記のように変更すれば、1列目にはファイル名で、2列目以降に分解した各文字列が入ります。 Sub test() Dim wkdir As String Dim fname As String Dim spname As Variant Dim i As Integer Dim j As Integer wkdir = "c:\work\test\" fname = Dir(wkdir, vbDirectory) Do While fname <> "" If fname <> "." And fname <> ".." Then If (GetAttr(wkdir & fname) And vbDirectory) = vbDirectory Then i = i + 1 j = 0 Application.ActiveSheet.Cells(i, 1) = fname spname = Split(fname, "_") For Each x In spname j = j + 1 Application.ActiveSheet.Cells(i, j) = x Next End If End If fname = Dir Loop End Sub dir関数でvbDirectoryがフォルダ指定になりますが、継続するdirではフォルダのみの取得とはならないため、 If (GetAttr(wkdir & fname) And vbDirectory) = vbDirectory Then で、フォルダのみを処理するようにしています。

noname#22222
noname#22222
回答No.2

Dir()を利用した場合、フォルダとファイルの区別する方法を思い出しませんでした。 そこでファイルシステムオブジェクト版を示しておきます。 質問そのものの核心部には、これでも応えているかと思います。 0ffice2000 Sp3 **************************** 0ffice2000 Sp3 ============================ FAX **************************** FAX ============================ My Data Sources **************************** My Data Sources ============================ My Download **************************** My Download ============================ 次は、このように<マイドキュメント>を表示するサンプルコードです。 サブフォルダー以外のファイルは当然のことながら表示対象から除外しています。 Private Sub コマンド0_Click()   Dim I     As Integer   Dim J     As Integer   Dim N     As Integer   Dim M     As Integer   Dim fldList() As String   Dim fldName() As String      fldList() = GetFolderList("D:\xxxxxx")   N = UBound(fldList()) - 1   For I = 0 To N     Debug.Print fldList(I)     Debug.Print "****************************"     fldName() = Split(fldList(I) & " ", " ")     M = UBound(fldName()) - 1     For J = 0 To M       Debug.Print fldName(J)     Next J     Debug.Print "============================"   Next I End Sub fldName() = Split(fldList(I) & "_", "_") 質問のケースでは、とスペースの代わりにアンダーバーで分割する必要があります。 GetFolderList() で、一気にフォルダ名一覧を fldList() に読み込んでいます。 僅か一行で済みますのでルーチンが非常に単純化するのが特徴です。 この場合、Microsoft scripting runtime を参照すせる必要があります。 Public Function GetFolderList(ByVal strDir As String, _                Optional strName As String = "*") As String() On Error GoTo Err_GetFolderList   Dim strFiles As String   Dim fso   As FileSystemObject   Dim fol   As Folder   Dim sfl   As Folders   Dim esf   As Folder      Set fso = New FileSystemObject   Set fol = fso.GetFolder(strDir)   Set sfl = fol.SubFolders   For Each esf In sfl     strFiles = strFiles & "," & esf.Name   Next Exit_GetFolderList: On Error Resume Next   GetFolderList = Split(Mid(strFiles, 2), ",")   Exit Function Err_GetFolderList:   strFiles = ""   MsgBox Err.Description & "(GetFolderList)", vbExclamation, " 関数エラーメッセージ"   Resume Exit_GetFolderList End Function

YJET
質問者

お礼

上記のYeti21さんの回答で解決いたしました。 本当にありがとうございました。

YJET
質問者

補足

回答ありがとうございます。 ...私には難しいみたいです。 上記のコードが何がなんだか分かりません。。 勉強不足でごめんなさい。 もう少し、詳しく(簡単に?)教えていただけると嬉しいです。 コード途中の説明が少し欲しいです。 よろしくお願いいたします。

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.1

勘違いでなければ、こういうことでしょうか? 簡単なサンプルなので、適当に環境に合わせて見てください。 Sub test() Dim fname As String Dim spname As Variant Dim i As Integer Dim j As Integer fname = Dir("c:\work\test\") Do While fname <> "" i = i + 1 j = 0 spname = Split(fname, "_") For Each x In spname j = j + 1 Application.ActiveSheet.Cells(i, j) = x Next fname = Dir Loop End Sub

YJET
質問者

補足

早速の回答ありがとうございます。 上記のサンプルのDirの参照先を変更し、テストしてみたのですが、うまくできません。 実行時にエラーが出るわけではなく、実行はされているようなのですが、セルに一覧が表示されません。 上記のVBの場合、(c\work\test内のフォルダ一覧を表示させ、アンダーバーで区切る) A B C D E 1 1234_5678_ああ_20061030 1234 5678 ああ 20061030 2 5678_1234_いい_20061031 5678 1234 いい 20061031 ・ ・ ・ となるのでしょうか? fnameはFileNameと一緒だとすると、fnameでフォルダ名は拾ってこられるのでしょうか? 教えてください。 よろしくお願いいたします。

関連するQ&A

  • Excel関数 文字分割

    A列               関数の結果求めたい値 AAAA BBBB(半角スペース区切)     AAAA AAAA BBBB(全角スペース区切)    AAAA AAAA/BBBB(半角/区切)        AAAA AAAA/BBBB (全角/区切)       AAAA =LEFT(A1,FIND(" ",SUBSTITUTE(A1," "," "))-1) =LEFT(A1,FIND("/",SUBSTITUTE(A1,"/","/"))-1) Excelの関数で一回の関数で上記二つの関数を使用して 区切文字複数を考慮して文字分割したいのですが、 どのように実施すればよいかご教授ねがえますでしょうか? IF文を使うのかもしれないとは思いいろいろと試したのですが うまく出来ない為質問させて頂いたおります。

  • 【excel vba】エクセルファイル内にある数式の内「関数名(IF,SUM等)」のみを、同ファイル内の新しいシートに一覧化したいです。

    vba初心者です。(ネットからコードを拾ってきてちょっと改造できる程度) excel 2003を使用しています。 【前提】 ・「数式」「数値」「文字列」等がセルに入力されたエクセルファイルを使用する  ⇒「関数名」のみを表示する。(文字列や数値が入力されたセルは無視) ・「数式」セルには「関数」が使われているものと、そうでないものがある ・1セル内に複数の関数が使用されている場合あり(新出の関数名であればすべて抽出したい) ・検索対象シート:ブック内のすべてのシート 【質問】 findメソッドで「IF」や「SUM」というように直接関数名を指定して検索するのではなく、「関数」というククリで検索はできるのでしょうか? その検索結果を同ファイル内に新しいシート(Sheet1)を作成し、「関数名」を一覧表示するという流れ(以下にまとめました)にしたいです。 【手順】 (1)Book1内で「関数」検索をする (2)「関数」が見つかった場合は「Sheet1」シートを作成(関数が見つからない場合は,msgbox "該当なし") (3)検索した「関数名」をSheet1のA1セルに入力する (4)Book1内すべて(複数シート有り)の関数名を抽出するまで連続検索をする  ⇒A1→A2→A3→…の様に、A列の上から順に入力していく ※関数名の重複がないように一覧化できれば最高です。 ※シート毎に、抽出した関数名を分けなくて大丈夫です。(あくまでファイル全体で使用されている関数名の一覧) (5)msgbox "終了" 解決方法をご存知の方、ご教示願えませんでしょうか。 宜しくお願いいたします。

  • EXCEL2007で文字列の右側から特定文字を抽出

    EXCEL2007で1つのセルの文字列の右側から最初の"/"が出現したときまでの文字を抽出する方法を教えてください。 (例)  A 1エクセル/関数/123456/ここがターゲット 2 3 ⇒関数を使用し、上記A1セルの「ここがターゲット」の文字列を抽出したいのです。 神様、どうか教えてください!

  • Excel関数

    お世話になります。 Excelで、あるセル内の「~~Number○○~~」という文字列から、前後の不要な文字列を省いて「Number○○」部分だけを抽出する方法(関数?)はありますか。  注)○○の部分には様々な数字が入り、1桁の場合と2桁の場合があります。 また、「~~Number○○~~」という文字列から、自分で指定した特定の数字を含む場合のみ「Number○○」の文字列だけを抽出する方法もありますか。 ご教示いただきたく存じます。よろしくお願いします。

  • Excel2003の関数で文字の抽出

    Excle初心者です。以下のことを関数を使用して実行したいのですが・・・。宜しくお願いします。 列の各セルには文字の羅列があります。これらの特定文字のみを抽出またはカウントしたい。   列1 ----------- (1)(2)(3) (2)(3) (3)(5) (1)→1 (2)→2 (3)→2 (4)→0 (5)→1

  • FTPサーバーから受信したファイル一覧からファイル名だけを取得したいです

    こんばんは。いつもお世話になっております。 VB.NET+WinXPなのですが、 FTPサーバーにログインして、 LISTコマンドでファイル一覧を要求すると 「drwxrwxr-x 2 53 53 4096 Feb 28 2006 abc」 などというファイルやフォルダの一覧がかえって来ると思うのですが、 この中からファイル名やフォルダ名だけを取得するには どうしたらよいでしょうか。 TABやコンマが入っていないので、文字列関数で切り取るにも 区切りがわからないと思うのです。 ローカルドライブのDir関数なら、FileAttribute.Nomalや.Directoryの指定でファイル名だけや ディレクトリー名だけを指定して 取得することが出来るのですが、FTPサーバーの場合からの場合はどういった方法があるでしょうか。 参考程度でも構いませんので教えて頂けるとたすかります。m(__)m

  • Excelの文字数が決まっていない文字列の抽出

    教えてください。Excelで、文字数の決まっていない文字列を抽出したいのですが、例えば、 セルA1 : プロジェクト1 簡単な文章 2352 PD_JOK セルA2 : プロジェクト13 複雑な文章列とは決まっていない 2453 AO_JKI ・・・・・・ というセルから、 プロジェクト名から、半角数字前までの文字数が決まっていない文字列「簡単な文章」や「複雑な文章~」をセルB列に抽出する方法を教えていただきたいのですが、 そして、半角数字後の半角英字「PD_JOK」をセルC列に抽出する方法も同時に教えてください。 万単位でデータがあるので、関数を使わないと難しいです。 よろしくお願い致します。

  • EXCEL2010で同じ文字列のセルの数を数え・・

    EXCEL2010で一つのワークシート上に様々な文字列が散らばっているとします。 この中でたとえばAAAという文字列が何個あるかを抽出してAAA 1、またBBBという文字列が何個あるかを抽出してBBB 3というように表示させたいのですが、方法をご存じの方、よろしくお願いいたします。VBAを使わずに解決して下さると嬉しいです。 ちなみに、COUNTIFなどの関数は、あらかじめ探したい文字列が分かっている場合には使えますが、本件はそうではなく、ワークシート上にどんな文字列があるのか一目ではわからないくらいたくさんあります。 理想は、その文字列が入っている全てのセルを範囲選択しておいて、何か関数で抽出させ、 AAA 3 ABC 19 BBB 21 DCF 3 などといったリストが作成されることです。 よろしくお願いいたします。

  • Excel2003 ユーザー定義関数 で SUBTOTALとSUMPRODUCTの複合できますか?(複数条件)

    こんばんは。お願いします。 まず、セルA2、B2にそれぞれフィールド名"あ"、"い"があるとします。 この2列目以下にオートフィルターを使います。 A列のA3,A4…には文字列"a","b","う",または"かき"が入っていて、 B列のB3,B4…には数値(整数)が入っているとします。 このとき、セルB1にVBAで作成した関数を入れたいと思っています。 Excel2003です。 その関数は、以下の条件(1)と(2)を同時に満たします。 (1)A列が"a"または"かき"である場合のみ、その行のB列の数値の合計を計算する(SUMIF関数で可能) (2)オートフィルターを用いて抽出したら、表示されているB列の数値だけの合計を計算する(SUBTOTAL関数で可能) (3)作業列は使えません。 要するに、表示されているセルのうち、条件にあうもののみ計算したい、ということです。 もしこのようなことがワークシート関数でもできるのであれば、それで構いません。 どうぞ、よろしくお願いいたします。

  • excel 文字列抽出に関する質問

    エクセル文字列抽出について質問です。 例えば、 "西郷 隆盛" この文字列から、" "の前後に分けて "西郷" と "隆盛" をユーザ定義関数を用いて、それぞれ別セルに抽出する場合、どのようにモジュールに入力すれば良いのでしょうか? ご教授願います