Excel for mac 2011でDir関数を使用したファイルサーチが出来ません。なぜなのでしょうか?

使用環境は、Excel for mac 2011 ver. 14.1.0, MacOS X 10.6.7, MacBook Airです。

働いている研究室がMac onlyのため、Mac版のExcelにvbaを移植しようと考えているのですが、以下のプログラムが上手く動きません。

------------------vbaプログラム
Private Sub CommandButton1_Click()

Dim strPATHNAME As String ' 指定フォルダ名
Dim strFILENAME As String ' 検出したファイル名
Dim ExistFILE As Boolean ' "*.TXT"ファイルの判定

' 「フォルダの参照」よりフォルダ名の取得
strPATHNAME = MacScript("choose folder")
strPATHNAME = Mid(strPATHNAME, 7) 'aliasを削る

If strPATHNAME = "" Then Exit Sub

' 指定フォルダ内のTEXTのファイル名を参照する
strFILENAME = Dir(strPATHNAME, vbNormal) '<------ここでファイルを検出しない。
ExistFILE = strFILENAME Like "*.TXT"

If strFILENAME = "" Then

MsgBox "このフォルダにはTXTファイルは存在しません。"

Exit Sub

End If

End Sub
------------------

上記プログラムは、コマンドボタンを押すとフォルダを指定して、その中の”.TXT”という拡張子のついたファイルを見つけるプログラムです。(実際には何もしないダミープログラムですが)

しかしこれを実行すると、Dir関数の所で何も検出してくれません。
ローカル変数を追って、フォルダまでのパスにカタカナが入ったらダメだとか、”alias”が邪魔だとかは解決したのですが、肝心のDir関数が上手く動いていないことに気づきました。

どなたか詳しい方にお願い致します。
どうすれば、指定したフォルダ中の拡張子”.TXT”がついたファイルを見つけることが出来るのか?教えて頂ければ幸いです。

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

A 回答 (2件)

Macの経験はないが、また質問の路線(Dir)ではないが、どうしても長引くようなら


http://oshiete.goo.ne.jp/qa/6370638.html
の方法でやってみてはどうでしょうか。
Macの記事だし、DirよりVBscriptの方がやりや水かもしれない。
ウインドウズの質問では両方答えているが。
質問者は相当やり手でのようなので、既に知っていて、賛同は得られないかもしてないが。
    • good
    • 0
この回答へのお礼

ご回答有難う御座います。

サンプルコードを見ていただければわかりますが、既にMacScript関数は織り込み済みです。
また、FSOはもともとWinのActiveXなので、無理だろうなと思いつつ試してみました。案の定、ダメでした。

それと、私はMacOS X歴21日、Excel for mac歴2日のずぶの素人です。プログラミング歴は25年を超えてるので、カンで適当に組んでみましたが、Macのファイルシステムは、勝手が分かりませんね><

誰か、Mac歴の長い方、解決の程宜しくお願い致します。

お礼日時:2011/04/21 23:37

当方 WinXP Acc2002 環境ですが、ヘルプにこう載っています。


以下抜粋
vbDirectory 16 フォルダ
vbAlias 64 エイリアス ファイル。Macintosh でのみ使用できます。



メモ これらの定数は、Visual Basic で定義されています。したがって、実際の数値の代わりにコードで使用することができます。

解説

Windows の場合、複数のファイルを指定するための "*" (アスタリスク) および "?" (疑問符) のワイルドカード文字を使用できます。Macintosh の場合、これらの文字は有効なファイル名の文字として扱われるため、このワイルドカード文字を使用して複数ファイルを指定することはできません。

また、Macintosh でワイルドカード文字がサポートされていないため、ファイルの種類によって複数のファイルを識別することができません。特定の種類のファイルを指定するには、ファイル名を使用せずに MacID 関数を使用します。例えば、次の例では、最初に見つかった、タイプが TEXT のファイルを返します。

Dir("SomePath", MacID("TEXT"))

フォルダ内のすべてのファイルに対して繰り返して処理を実行する場合は、引数を指定せずにDir を実行してください。

Dir("")

Windows で MacID 関数と Dir 関数を組み合わせて使用した場合はエラーが発生します。

引数 attribute に 256 より大きな値を指定した場合は MacID 関数の値と見なされます。
    • good
    • 0
この回答へのお礼

ご回答ありがとう御座います。

MacIDの作戦は既に実行済みですが、全く変化ありません。
そもそもDir関数が、指定したフォルダにファイルがあるにもかかわらず、何もファイルを見つけられないという状況です。

また、処理しようとしているファイルはWinで得たデータファイルのため、クリエータ情報が欠落致しております。(入れれば良いだけですがめんどくさい)
試しにクリエータ情報を入れたファイルを置いてみましたが、やはり反応がありません。
本質的に、MacID作戦では解決出来ないと感じております。

お礼日時:2011/04/21 16:57

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

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

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

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

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

Qエクセルで種類を数える関数が無いのは何故?

エクセルで種類を数える関数が無いのは何故なんでしょうか?

エクセルで種類を数えるには、いくつかの関数を組み合わせるのが一般的ですよね?
直接数える関数が無いのは、訳があるんでしょうか?

Aベストアンサー

>>エクセルで種類を数える関数が無いのは何故なんでしょうか?

やっぱり、そういう関数が必要な方が全体からみたら少数派だと、エクセルの開発者たちが考えているからではないかと思います。
また、既存の関数を組み合わせたら、対処可能だから、無理して新しい関数を作る必要性もない、開発の優先順位が低いって判断もあるでしょうね。

私は、エクセルの表を作ったり、エクセルVBAでプログラムを作ったりしますけど、そういう関数が必要になったことが全くありませんし。

QDir関数で読み取り順を操作できる?

あるフォルダ内のファイルを名前順で読みたいのですが、
読み取り順を操作することは可能ですか?

Aベストアンサー

こんにちは
#1,#2さんのとおりそのままではできないと思います。
私はファイル名で並べ替えるときは、Sorted=Trueにした「リストボックス」にAdditemしていって、取得してからIndex順に読みます。
ファイル名を取得するロジックはサンプルにあったと思います。
ちなみにサイズや更新日順の場合は配列に入れてソートするようにしています。
では!

Qエクセルの関数で

エクセルの関数辞典を見ていたら、CUMPRINC関数というのがありました。
しかし、エクセルの「挿入」→「関数」→関数の分類で「財務」というのを選択したのですが、一覧表に載っていません。
どこに載っているのでしょうか?
どうすればこの関数を使えますか?
ちなみにシートの上でやっても関数の反応をしませんでした。

Aベストアンサー

Yahooで検索してみると、参考URLが引っかかりました。

参考になりませんか?

参考URL:http://money-sense.net/doc/20041215_224257.php

QDir関数について

MyPath = "c:\test\"
MyName = Dir(MyPath, vbDirectory)
Do While MyName <> ""
If MyName <> "." And MyName <> ".." Then
Debug.Print MyName
End If
MyName = Dir
Loop
-------------------------------------------------
いきなりコーディングを紹介しましたが、
上記だと"C:\test\"の直下のファイル・フォルダしかデバッグアウトされませんが、
"C:\test\sample"のように、"C:\test\"配下にまだフォルダがあり、
それらを表示させるにはどのようにしたらよろしいでしょうか?

大変見づらくて申し訳ありませんが、宜しくお願い致します。

Aベストアンサー

こういうのは再帰を使用すると、つくりが簡単になってわかりやすいと思います。
ただし、Dir 関数は、続きを表示させるときには引数を指定せずに実行しますが、これが下の階層のフォルダの表示から戻ってきたときに、下の階層のフォルダの続きを検索しようとしてしまうので、ちょっと工夫が必要です。
↓こんな感じでどうでしょうか。

Sub Command1_Click()
  Call ListFolder("C:\Test")
End Sub

Private Sub ListFolder(ByVal strFolderName As String)
  Dim strSubFolder As String
  Dim strFullPath As String
  Dim strSubArray() As String
  Dim intIndex As Integer
  Dim i As Integer

  ReDim strSubArray(0)
  strSubFolder = Dir(strFolderName & "\*", vbDirectory)
  Do While strSubFolder <> ""
    If strSubFolder <> "." And strSubFolder <> ".." Then
      strFullPath = strFolderName & "\" & strSubFolder
      If GetAttr(strFullPath) = vbDirectory Then
        Debug.Print strFullPath
        intIndex = UBound(strSubArray) + 1
        ReDim Preserve strSubArray(intIndex)
        strSubArray(intIndex) = strSubFolder
      End If
    End If
    strSubFolder = Dir
  Loop

  For i = 1 To UBound(strSubArray)
    strFullPath = strFolderName & "\" & strSubArray(i)
    Call ListFolder(strFullPath)
  Next i

End Sub

こういうのは再帰を使用すると、つくりが簡単になってわかりやすいと思います。
ただし、Dir 関数は、続きを表示させるときには引数を指定せずに実行しますが、これが下の階層のフォルダの表示から戻ってきたときに、下の階層のフォルダの続きを検索しようとしてしまうので、ちょっと工夫が必要です。
↓こんな感じでどうでしょうか。

Sub Command1_Click()
  Call ListFolder("C:\Test")
End Sub

Private Sub ListFolder(ByVal strFolderName As String)
  Dim strSubFolder As String
  Dim st...続きを読む

Qエクセルの関数 ネスト

エクセルの関数 ネスト

エクセルの関数で、ネストさせるときがあるとおもうのですが、

関数を内側に書いたらよいのか外側に書いたらよいのか分からなくなる時があります。

エクセルの関数に関してわかりやすく書いてあるページなどありますか。

Aベストアンサー

こんばんは

Excel2003までは、ネストが7まで、2007では64までが可能です。
http://www.google.co.jp/search?hl=ja&source=hp&q=excel+%E3%83%8D%E3%82%B9%E3%83%88%E3%80%802003%E3%80%802007&aq=f&aqi=&aql=&oq=&gs_rfai=

「仕様上は可能」でも、複雑なネストは間違いが生じやすいですし、変更もしにくくなります。「出来るだけネストはしない」「適宜、中間結果をセルに出力する」という方法を採った方が、間違いが少なく、柔軟性のあるシステムになると思います。

>エクセルの関数に関してわかりやすく書いてあるページなどありますか。
関数の個別の機能ならば、Webサイトも書籍も多数あるのですが、「組み合わせて使う」というのはその場その場での発想になってしまうと思います。

QVB6 Dir関数で52エラー発生

いつもお世話になっています。
最近になって、VB6のDir関数を実行するとき、実行時エラー52が発生します。
既存のプログラムに、メール送信機能を追加しました。
このとき、BASP21をインストールしました。
これ以外のプログラムのインストールはWindowsUpdate以外はかかっていません。
皆さん、このような現象は体験されていますでしょうか?
解決策をご存知の方、ご教授願います。
BASP21が悪いのかと思い、アンインストールしましたが、現象は再現します。
VB6の再インストールをしましたが、再現します。
以上よろしくお願いします。

Aベストアンサー

私も先週末、全く同じ内容 = Dir 関数で 52 エラーが、立て続けに
2 件出て、焦りまくった者です。

自分のところの場合、Dir 関数をフォルダ or ファイルの存在チェックに
用いていたのですが…

引数にネットワーク越しのパス = \\+コンピュータ名 or IP アドレスから
始まる文字列を指定すると、場合によって、エラーになりました。

通常、Dir 関数は、引数で渡したフォルダ or ファイルが存在しないと
空白を戻しますが…

引数に、ネットワーク越しの共有フォルダ or ファイルを指定すると
アクセス可能な状態である場合は良いのですが、そうではない場合、
52 エラーになるようです。

また、ローカルのパスでも、パスとして無効な文字列だと、これまた
場合によって、52 エラーになる場合があります。(ただ、ならない場合も
あるんですよね~)

C:: ⇒ 52 エラー
C\\ ⇒ 正常(空白を戻す)

FileSystemObject の FileExists、FolderExists メソッドだと、
上記のようなことはないので、現在、置き換え中です。

nobupapa さんの状況には当てはまらないかもしれませんが、
一例まで。(-_-)b

私も先週末、全く同じ内容 = Dir 関数で 52 エラーが、立て続けに
2 件出て、焦りまくった者です。

自分のところの場合、Dir 関数をフォルダ or ファイルの存在チェックに
用いていたのですが…

引数にネットワーク越しのパス = \\+コンピュータ名 or IP アドレスから
始まる文字列を指定すると、場合によって、エラーになりました。

通常、Dir 関数は、引数で渡したフォルダ or ファイルが存在しないと
空白を戻しますが…

引数に、ネットワーク越しの共有フォルダ or ファイルを指定すると
ア...続きを読む

Qエクセル関数の解読サイトなんてありますか?

エクセル関数の解読サイトなんてありますか?

いつもお世話になっております<(_ _)>

エクセルファイルに関数の入った数式が入力されています。
セルごとに複数の関数が入っていますが、私にはちっともわかりません。

そこで質問です。
こんなとき「エクセル関数を解読」してくれるようなサイトってありませんか?

たとえば検索窓があってそこに「=SUM(S1:S13)」わからなくて困っている関数式を入力。
すると答えの別ボックスに「S1~S13までの数値の合計」と出てくるようなサイト。

それに近いサイトでも良いので知っている方がいらっしゃればぜひ、教えてください<(_ _)>

Aベストアンサー

もし、

=IF(E14="","",IF(O14="",(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1300,(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1625))

だったら、どういう文章が出て欲しいのでしょうか?

もしE14が空白だったら、
 空白、
そうじゃなかったから、
 もしO14が空白だったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1300
 そうじゃなかったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1625

って感じですか?
数式をそのまま読解したほうが解りやすくないですか?

QExcelマクロ(excel4.0)のTODAY関数で日付が正常に表示できない

Excel VBAで開発されたソフトの改造を行っているのですが、初めてのVBAで悪戦苦闘しております。

Excel2000で開発されたソフトでマクロ(excel4.0)が組み込まれてますが、下記の方法で日付を表示すると"2004/10/7"と表示されてしまいます。

=FORMULA(TODAY(),!HIZUKE)

当たり前なのですが、下記だと"2008/10/8"と表示されます。

=FORMULA("2008/10/8",!HIZUKE)

パソコンの時計は 2008/10/8 に設定されてます。
HIZUKEのセルの書式設定は「日付-2005/3/15」の種類で設定してます。
Excel2000とExcel2007で確認しましたが、同じ症状です。

違うパソコンで確認しましたが、改善できず困ってます。
原因がわかる方、ご教授いただけると助かります。

<開発環境>
・WindowsXP Pro SP3
・Celeron 540(1.8GHz)
・メモリ1GB
・Excel2007 SP1 (Office2007)

Excel VBAで開発されたソフトの改造を行っているのですが、初めてのVBAで悪戦苦闘しております。

Excel2000で開発されたソフトでマクロ(excel4.0)が組み込まれてますが、下記の方法で日付を表示すると"2004/10/7"と表示されてしまいます。

=FORMULA(TODAY(),!HIZUKE)

当たり前なのですが、下記だと"2008/10/8"と表示されます。

=FORMULA("2008/10/8",!HIZUKE)

パソコンの時計は 2008/10/8 に設定されてます。
HIZUKEのセルの書式設定は「日付-2005/3/15」の種類で設定してます。
Excel2000とExce...続きを読む

Aベストアンサー

またまた登場、onlyromです。
ACTIVATE、ヒントになったようで何より。

xl2007は持ってないので今回も戯言という程度ですが。。。(^^;;;
 
>コードを確認しましたが、意図的に1900/1904年の切り替えをしている場所は見つかりません
>同じソフトの別のマクロで
>=FORMULA(TODAY(),!HIZUKE)
>を行ってますが、ここでは正常な日付(現在日付)が表示される

1900年、1904年を切り替えしてるコードがないにも拘わらず
同じコード【=FORMULA(TODAY(),!HIZUKE)】の結果表示が違うというのはおかしいので
やはりどこかで切り替えしているのではないでしょうか。
確認はシートモジュール、標準モジュール等も確認されましたか?

例えば、以下のような場合はどうでしょう。

セル"HIZUKE" がSheet1にあり、Sheet1のChangeイベントで
"HIZUKE"のセルが変化した場合、1904年モード -> 1900年モード
それ以外のセルが変化した場合、1900年モード -> 1904年モード
にする
もちろん1904年モードにするのは別のところでもいいですが。。。

Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address = Range("HIZUKE").Address Then
   ThisWorkbook.Date1904 = False
 ElseIf Target.Address = "$B$5" Then
   ThisWorkbook.Date1904 = True
 End If
End Sub

表示結果のおかしい、=FORMULA(TODAY(),!HIZUKE) を実行する前に
このシート、または別のシートのイベントなどで1904年モードにしていたら、
上記コードのような場合、質問のようになりますよね。

ThisWorkbookモジュール、Sheetモジュール、標準モジュール等のコードも
確認したのなら(たぶんしたでしょうが)、この回答はなかったことに。。。。(^^;;;;

以上。

またまた登場、onlyromです。
ACTIVATE、ヒントになったようで何より。

xl2007は持ってないので今回も戯言という程度ですが。。。(^^;;;
 
>コードを確認しましたが、意図的に1900/1904年の切り替えをしている場所は見つかりません
>同じソフトの別のマクロで
>=FORMULA(TODAY(),!HIZUKE)
>を行ってますが、ここでは正常な日付(現在日付)が表示される

1900年、1904年を切り替えしてるコードがないにも拘わらず
同じコード【=FORMULA(TODAY(),!HIZUKE)】の結果表示が違うというのはおかしいの...続きを読む

Qエクセル関数を、書き写して分析できるツールはある?

タイトルの件、質問します。

エクセルの関数を分析する際に、エクセルの数式バーや、セルに入っている関数を
F2を教えて見るのでは、見にくい場合があります。

現在は、私は、メモ帳に関数をコピーして、分析したり、修正したりしています。
エクセルの機能or他ソフトで、関数を分析できるツールはあるのでしょうか??

【エクセルバージョン】
2003、2007

Aベストアンサー

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利な方法です。
そもそも計算が通っていない(たとえばカッコの対応が間違えていて,Enterしても受け付けてくれないようなミスをしている場合)には使えません。



また,数式バーの中で数式の「中」にカーソルを入れて左右の矢印キーでカーソルを動かしていったときに,「(」や「)」をまたいだ瞬間に,対応する「閉じカッコ」「始まりのカッコ」が色つきで強調表示されるのを確認しながら,カッコの対応がまちがえてないかなどを調べるのも簡易な良い方法です。


あまり使わない方法ですが,数式の中で適宜ALT+Enterを打って「セル内改行」してしまい,数式を縦に分解して書いてみるのも整理しやすい方法のひとつです。

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利...続きを読む

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&Aを見た人がよく見るQ&A

人気Q&Aランキング