Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Access 2010)
ファイル名の検索で、空白や大文字が除外されてしまう
投稿日時: 19/02/07 14:44:05
投稿者: takatada72

お世話になります。
 
下記のようなVBAにて、ファイルを検査するのですが、ファイル名に空白がある場合・
ファイル名の一部に全角文字がある場合には、ファイルが無いと言われてしまいます。
どのようなプログラムにすれば、それらを無視して検査可能になりますでしょうか
※VBAは初心者になります。
 
例: F100120 PRINT.jpg 空白が含まれている
  @100200.jpg @が大文字になっている
※ファイルの基本は、半角小文字にしているのですが、気にしない方がいるため、
その辺もカバーできると嬉しいです。
 
お忙しいとは思いますが宜しくお願い致します。
 
Dim myFName As String
Dim FName As String
Dim myFName2 As String
 
Dim URL As String
 
    
          FName = "\\data\製品番号\" & [番号] & "*"
       myFName = Dir(FName)
 
 
    Do While myFName <> ""
        FName = "\\data\製品番号\" & myFName
        URL = FName
                    
       CreateObject("Wscript.Shell").Run FName, 5
         
        myFName2 = myFName2 + myFName & Chr(13) & Chr(10)
        myFName = Dir()
 
    Loop
    '何個あるかわ表示
     If myFName2 = "" Then MsgBox "0ファイルでした。"

回答
投稿日時: 19/02/07 16:36:50
投稿者: sk

引用:
FName = "\\data\製品番号\" & [番号] & "*"

(フォームモジュールに記述されているコードだとして)
その際における[番号]のデータ型と値は
それぞれ何なのでしょうか。
 
引用:
F100120 PRINT.jpg 空白が含まれている

引用:
CreateObject("Wscript.Shell").Run FName, 5

CreateObject("Wscript.Shell").Run """" & FName & """", 5
 
引用:
@100200.jpg @が大文字になっている

引用:
※ファイルの基本は、半角小文字にしているのですが、気にしない方がいるため、
その辺もカバーできると嬉しいです。

Windows のファイルシステム上において
半角文字の「@」と全角文字の「@」は、明確に区別されます。
 
したがって、「@100200.jpg」という名前のファイルと
「@100200.jpg」という名前のファイルが
同じフォルダ内に存在するケースも許容されます。
(実際に誰がどうやってファイルを作っていて、
それぞれのファイルに名前を付けているかは不明ですが)
 
仮におっしゃっていることを実現しようとした場合、
[番号]の値が "@100" または "@100" である時に
その両方のファイル名を検出した上、その両方が
Run メソッドによって開かれてしまうことにも
なりかねませんが、そのような事態になることについては
問題視しなくてもよいのでしょうか。

投稿日時: 19/02/07 17:00:51
投稿者: takatada72

skさん
 
早速、ご回答をありがとうございました。
 
>その際における[番号]のデータ型と値は
>それぞれ何なのでしょうか。
ACCESS上のコントロールは、半角英数になっております。
 
>F100120 PRINT.jpg 空白が含まれている
F100120の部分は、製品番号で、その後に、分かりやすい文字列を記入しております。
 
「CreateObject("Wscript.Shell").Run FName, 5」を
「CreateObject("Wscript.Shell").Run """" & FName & """", 5」に変更した方が良いと言う意味でしょうか
 
>仮におっしゃっていることを実現しようとした場合、
>[番号]の値が "@100" または "@100" である時に
>その両方のファイル名を検出した上、その両方が
>Run メソッドによって開かれてしまうことにも
>なりかねませんが、そのような事態になることについては
>問題視しなくてもよいのでしょうか。
基本点には、製品番号で検索するファイル名が決まるため、@100-半角 /@100-全角の
2つが表示される事は、OKと考えております。-ファイルがあると認識してくれた方が
ありがたいです。
 
>ファイルの作り方は、
画像に変換したものを手入力で、記入しているだけなので、@マークなどは、
人によって、全角だったりしております。
 
引き続きご指導を宜しくお願い致します。

回答
投稿日時: 19/02/08 09:53:37
投稿者: sk

引用:
「CreateObject("Wscript.Shell").Run FName, 5」を
「CreateObject("Wscript.Shell").Run """" & FName & """", 5」に
変更した方が良いと言う意味でしょうか

そうです。
 
WshShell オブジェクトの Run コマンドの
第 1 引数 strCommand に渡されるのは
実行するコマンドラインを示す文字列であり、
コマンドラインにおける半角スペースは
それぞれのパラメータを区切るための記号として
使用されます。
 
「ファイルパスの一部としての半角スペース」として
解釈させるためには、そのファイルパス全体を
ダブルクォーテーションで囲まなければなりません。
 
引用:
基本点には、製品番号で検索するファイル名が決まるため、
@100-半角 /@100-全角の2つが表示される事は、
OKと考えております。

引用:
FName = "\\data\製品番号\" & [番号] & "*"

FName = "\\data\製品番号\*"
 
引用:
FName = "\\data\製品番号\" & myFName
URL = FName
             
CreateObject("Wscript.Shell").Run FName, 5
  
myFName2 = myFName2 + myFName & Chr(13) & Chr(10)
myFName = Dir()

If myFName Like [番号] & "*" Then
    FName = "\\data\製品番号\" & myFName
    URL = FName
                 
    CreateObject("Wscript.Shell").Run """" & FName & """", 5
      
    myFName2 = myFName2 & myFName & vbCrLf
End If
myFName = Dir()

投稿日時: 19/02/08 16:29:50
投稿者: takatada72

skさん
 
お世話になりっております。
 
「CreateObject("Wscript.Shell").Run """" & FName & """", 5」に
変更した時には、空白が入ったファイル名も認識されました。
 
また、下記のように全体的に変更したところ、画像の認識が無くなって
しまいました。
 
URL = FName の URLの変数はどちらで利用するのでしょうかお忙しいとは
思いますが宜しくお願い致します。
 
今回、下記のように変更したプログラム
FName = "\\data\製品番号\" & myFName
URL = FName
              
CreateObject("Wscript.Shell").Run FName, 5
   
myFName2 = myFName2 + myFName & Chr(13) & Chr(10)
myFName = Dir()
 
If myFName Like [番号] & "*" Then
    FName = "\\data\製品番号\" & myFName
    URL = FName
                  
    CreateObject("Wscript.Shell").Run """" & FName & """", 5
       
    myFName2 = myFName2 & myFName & vbCrLf
End If
myFName = Dir()

回答
投稿日時: 19/02/08 16:57:00
投稿者: sk

引用:
また、下記のように全体的に変更したところ、画像の認識が無くなって
しまいました。

「画像の認識」とは何のことをおっしゃっているのでしょうか。
 
引用:
Dim URL As String

引用:
URL = FName

引用:
URL = FName の URLの変数はどちらで利用するのでしょうか

それは takatada72 さんご自身が最初に投稿されたコード
含まれていたステートメントをそのまま転載(引用)しただけであって、
その変数が何のために宣言され、何のために使用されるのかなど
私に分かるわけがありません。
 
引用:
今回、下記のように変更したプログラム

それと、私の投稿については「引用したコード」に対する
「コードの修正例」を個々に示す形を採っていますが、
もしかして全ての「引用したコード」と「コードの修正例」を
一緒くたにしてまるごとコピーし、そのままモジュールに
貼り付けるようなことをされてはいないでしょうか。

投稿日時: 19/02/12 12:11:32
投稿者: takatada72

skさん
 
お世話になっております。
 
色々と勘違いしているしだいで申し訳ありません。
 
URL = FName は私が最初に投稿させて頂いた内容に記載しておりました。
 
最初の投稿にも記載させて頂きましたように、VBAの内容が全く理解して
いないことからご迷惑をおかけして申し訳ありません。
※「引用したコード」と「コードの修正例」をまるごとコピーすれば、
実現すると考えておりました。
 
>「画像の認識」とは何のことをおっしゃっているのでしょうか。 
@100200.jpg などのファイル名から想像して頂けると良いのですが、
ACCESSの[番号]の所に記載されている番号と、ファイル名に記載されている
番号が一致したものだけを表示させたいのです。
 
 
空白は、こちらに切り替えることで、CreateObject("Wscript.Shell").Run """" & FName & """", 5
可能になりました。
 
あとは、ファイル名の中に全角が入っていたときにどのように対応するのかを
教えて下さい。
 
VBAが理解できていない相手に対して回答を出すのは非常にやっかいかも
しれません。
 
もう少しお付き合い頂けないでしょうか

回答
投稿日時: 19/02/13 20:57:00
投稿者: sk

takatada72 さんの引用:
※「引用したコード」と「コードの修正例」をまるごとコピーすれば、
実現すると考えておりました。

「まるごとコピペすれば正常に動作する 1 個のプロシージャ」として
回答したわけではなく、ただ必要最小限の校正をしただけです。
(特に赤字と青字で示した箇所)
 
19/02/08 09:53:37 の私の回答における 2 つの「引用したコード」は、
takatada72 さんの最初の投稿において掲載されたコードにおいて
(必要最小限の)「修正すべき箇所」として個々にピックアップした
に過ぎません。
 
あとはそれらの箇所だけを、それぞれの引用の後に示した
「コードの修正例」の通りに置き換えていただければ、
基本的には問題ないはずです。
 
takatada72 さんの引用:
Dim myFName As String
Dim FName As String
Dim myFName2 As String
  
Dim URL As String
  
     
          FName = "\\data\製品番号\" & [番号] & "*"
       myFName = Dir(FName)
  
  
    Do While myFName <> ""
        FName = "\\data\製品番号\" & myFName
        URL = FName
                     
       CreateObject("Wscript.Shell").Run FName, 5
          
        myFName2 = myFName2 + myFName & Chr(13) & Chr(10)
        myFName = Dir()
  
    Loop
    '何個あるかわ表示
     If myFName2 = "" Then MsgBox "0ファイルでした。"

(コードの修正例)
---------------------------------------------------------------------
 
Dim myFName As String
Dim FName As String
Dim myFName2 As String
  
Dim URL As String '何に使うかは知らん
  
FName = "\\data\製品番号\*"
 
myFName = Dir(FName)
 
Do While myFName <> ""
    If myFName Like [番号] & "*" Then
        FName = "\\data\製品番号\" & myFName
        URL = FName '何のために FName の値を代入しているかは知らん
                      
        CreateObject("Wscript.Shell").Run """" & FName & """", 5
           
        myFName2 = myFName2 + myFName & Chr(13) & Chr(10)
    End If
    myFName = Dir()
Loop
'何個あるか表示
If myFName2 = "" Then MsgBox "0ファイルでした。"
 
---------------------------------------------------------------------
 
最初の投稿で掲載されたコード全体に対して
修正例を示すならば上記の通りになるかと。
 
takatada72 さんの引用:
@100200.jpg などのファイル名から想像して頂けると良いのですが、
ACCESSの[番号]の所に記載されている番号と、ファイル名に記載されている
番号が一致したものだけを表示させたいのです。

あとは WshShell オブジェクトの Run コマンドによって
開く対象となるファイルの拡張子に制限を設けるかどうかの問題。

投稿日時: 19/02/14 12:27:23
投稿者: takatada72

skさん
 
ご立腹の中でのご回答をありがとうございました。
 
必要のないプログラムに対してご指摘をありがとうございました。
削除させて頂きました。
 
また、変更部分を青字に示しての修正内容をありがとうございました。
VBAが理解出来ていない者にとって大変助かりました。
 
 
今回、青字の修正点に変更させて頂き、プログラムを起動させたのですが、
どうしても全角が入ったもののファイル名だけ認識だけできませんでした。
 
行った内容は下記のような画像ファイルを作って行いました。
IF文のところでは、[番号]のコントロールは、 D100200(半角) が入って
いるのですが、全角の認識をどのように行っているのでしょうか
D100200-tools.jpg ← 通常のもの
D100200 tools.jpg ←空白を入れたもの
D100200-tools.jpg ← 全角を入れたもの
 
やっかいなやつに捕まったと嘆きもあるかと思いますが、宜しくお願い致します。
 

回答
投稿日時: 19/02/14 13:52:18
投稿者: sk

takatada72 さんの引用:
ご立腹の中でのご回答をありがとうございました。

特に怒るようなことをされた覚えは全くありませんが、
そのように思われたのであれば失礼しました。
 
takatada72 さんの引用:
今回、青字の修正点に変更させて頂き、プログラムを起動させたのですが、
どうしても全角が入ったもののファイル名だけ認識だけできませんでした。

takatada72 さんの引用:
IF文のところでは、[番号]のコントロールは、 D100200(半角) が入っている

・そのモジュールのモジュールレベルの先頭に
 Option Compare Database ステートメント
 (もしくは Option Compare Text ステートメント)が
 挿入されていない。
 ( Option Compare ステートメント自体がない)
 
・そのモジュールのモジュールレベルの先頭に
 Option Compare Binary ステートメントが
 挿入されている。
 
以上のいずれかに該当するからではないでしょうか。
 
引用:
If myFName Like [番号] & "*" Then

文字列比較の方式を Option Compare ステートメントの
設定に左右されないようにしたい場合は、
次のように書き換えてみてもよいでしょう。
 
-----------------------------------------------------
 
If InStr(1, myFName, [番号], vbTextCompare) = 1 Then
 
-----------------------------------------------------

投稿日時: 19/02/18 11:41:35
投稿者: takatada72

skさん
 
お世話になっております。
 
skさんの貴重なお時間を無駄にするようで申し訳ありませんでした。
 
無事に、If InStr(1, myFName, [番号], vbTextCompare) = 1 Thenへ
変更したことで、全角文字のファイル名も読み込む事ができました。
 
大変助かりました。
 
>特に怒るようなことをされた覚えは全くありませんが、
>そのように思われたのであれば失礼しました。
skさんは何も悪くないので、謝る事は必要ありません。私がご迷惑を
かけたと感じたまでです。
 
>Option Compare Database ステートメント
> (もしくは Option Compare Text ステートメント)が
> 挿入されていない。
こちらは、挿入していませんでした。今後のために、挿入しておきたい
と思っております。
 
無事に解決となりましたのでクローズとさせて頂きます。