Excel (VBA)

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

 
(指定なし : 指定なし)
フォームを閉じてからしかファイルが開きません
投稿日時: 18/09/02 20:39:40
投稿者: mum

はじめまして、質問させてください。
バーコードリーダーで読み取ったコードと同じ名前のファイルを開こうとしています。
出来れば同じテキストボックスに繰り返し入力したいと思っています。
 
以下のコードで試してみたのですがフォームを閉じてから1度だけファイルが開きます。
それを閉じると次は"E:\.AACが存在しません"と表示されます。
どのように書き換えればフォームが開いている最中にファイルが開けますでしょうか。
 
VBAについてはあちこち調べながら書いている素人ですのであまり難しいコードが必要なのであれば仕様の変更も検討しています。
皆様のお力を貸していただけないでしょうか。
よろしくお願いいたします。
 

Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

    Dim WSH
    Dim FileName As String
    Dim Target As String
    
    FileName = TextBox1
        
    Target = "E:" & FileName & ".AAC"
    
    If Dir(Target) <> "" Then
        Set WSH = CreateObject("Wscript.Shell")
        WSH.Run """E:" & FileName & ".AAC""", 3, True
    Else
        MsgBox Target & vbCrLf & "が存在しません"
        Exit Sub
    End If 
    
    Set WSH = Nothing
    TextBox1 = ""
    Cancel = True
    
End Sub

回答
投稿日時: 18/09/03 07:27:36
投稿者: simple

WSH.Run """E:" & FileName & ".AAC""", 3, True

WSH.Run """E:" & FileName & ".AAC""", 3, False
にすると、
処理の終了まで待たずに、VBA側の処理がつづけられる(いわゆる非同期処理)はずです。
https://msdn.microsoft.com/ja-jp/library/cc364421.aspx
を参照ください。
# 時間の都合上こちらでは確認していませんので、確認して下さい。

投稿日時: 18/09/03 12:01:31
投稿者: mum

simpleさま
ご回答いただきありがとうございます。
添付していただいたリンク先も確認しました。
早速書き直して試してみたところフォームが開いている間にファイルを開くことができました!
ありがとうございました!
 
しかし、テキストボックスを空欄にしてカーソルを移動させないという処理がうまくいきません。
処理の終了を待たずにVBA側の処理が続けられるということですのでEnd If以降の処理は実行されると思ったのですが...またこれにつきましてもご教示いただけますと幸いです。
お忙しいところ申し訳ございませんがよろしくお願いいたします。

回答
投稿日時: 18/09/05 07:12:22
投稿者: simple

解決してよかったです。
 
さて、私にはそのイベントプロシージャを使う必要性もよく理解できていませんが、
↓下記にだけコメントしておきます。
 
> しかし、テキストボックスを空欄にしてカーソルを移動させないという
> 処理がうまくいきません。
> 処理の終了を待たずにVBA側の処理が続けられるということですので
> End If以降の処理は実行されると思ったのですが...

フレークポイントを置いてステップ実行するか、
その位置に、Debug.Print "実行されました"
といったコードを挿入して確認してみて下さい。
実際に実行されているかは確認できますよね。
そうした調査をされた後に、想定と現実がどうちがうのか
説明されたらいかがでしょうか。
 
 
また、
    If TextBox1.Value = "" Then Exit Sub
といったものを冒頭に挿入すれば、
余計な
MsgBox Target & vbCrLf & "が存在しません"
が出されずに済むと思います。
 
 
なお、みなさんからコメントがつきにくいのは、
>バーコーリーダーで読み取ったコードと同じ名前のファイルを開こうとしています。
との関係でしょうか。
バーコードとTextBox1はどう関係しているのでしょうか。
そのあたりのことも併せて説明された方がよいと思います。

投稿日時: 18/09/05 11:26:58
投稿者: mum

simpleさま
何度もとても分かりやすく、ご丁寧にありがとうございます。
  
>フレークポイントを置いてステップ実行するか、
>その位置に、Debug.Print "実行されました"
>といったコードを挿入して確認してみて下さい。

ステップ実行したところ、

WSH.Run """E:" & FileName & ".AAC""", 3, True
以降が実行されていないことが分かりました。
  
MsgBox Target & vbCrLf & "が存在しません"
以降は正常に動作しています。
  
ご指摘いただいていたバーコードとTextBox1の関係ですが、
TextBox1にはバーコードで読み取った数字を入力しています。
ファイル名は各バーコードに対応した名前に変更していますので、
その数字に対応したファイルを開きたいと思っています。
  
>さて、私にはそのイベントプロシージャを使う必要性もよく理解できていませんが、
やりたいことを完結に書きますと以下の2点なのですが
1、バーコードに対応したファイルを開く
2、何度も連続で開ける
2を実行するために"Cancel=True"が有効かと思い、
このイベントプロージャーを使用しました。
先述のことを実行するためにより有効なイベントがあればそちらも勉強してみたいと思います。
  
もう少し自分なりに勉強して解決策が見つかりましたらこちらに記述したいと思います。

回答
投稿日時: 18/09/06 00:29:55
投稿者: MMYS

そのバーコードリーダはHIDキーボードデバイスとして認識されてませんか。
つまり、パソコンからの認識はキーボードです。
ですから動作は単純にキー入力後、Enterキー。
 

    Option Explicit

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
        'ここにファイルを開くコードを書く
        Debug.Print Me.TextBox1.Text
        
        Me.TextBox1.Text = ""
        Me.TextBox1.SetFocus
    End If
End Sub

Private Sub UserForm_Activate()
    Me.TextBox1.SetFocus
End Sub

たたし、メディアプレーヤーを起動して再生は可能ですが、
その時点でメディアプレーヤーフォーカスが移ってしまうので
 
mum さんの引用:

1、バーコードに対応したファイルを開く
2、何度も連続で開ける

「何度も連続で開ける 」にするには常にユーザーフォームがアクティブ
にする対策が必要です。
 

回答
投稿日時: 18/09/06 00:32:10
投稿者: MMYS

Defaultプロパティにを Ture にしたコントロールは
Enterキーを受け付けます。なのでその応用コード。
 

    Option Explicit

Private Sub CommandButton1_Click()
    Debug.Print TextBox1.Text
    
    Me.TextBox1.Text = ""
    Me.TextBox1.SetFocus
End Sub

Private Sub UserForm_Activate()
    Me.TextBox1.SetFocus
End Sub

Private Sub UserForm_Initialize()
    Me.CommandButton1.Default = True
End Sub

 
 

投稿日時: 18/09/08 17:24:56
投稿者: mum

MMYSさま                            
 
連日いろいろ試しており、御礼が遅くなりまして大変失礼いたしました。
またご丁寧なご回答ありがとうございました。
                            
バーコードリーダーは確認しましたところ"USB Composite Device"と表示されておりました。
しかし動作はまさにキーボードで、コードの入力後に自動的にEnterキーが押される仕様になっています。    
ただ、1つ目のコードではバーコードで入力されるEnterキーは

If KeyCode = vbKeyReturn Then
で拾われていなようで、改めてEnterキーを押す必要がありました。        
また、ご記載いただいていた通り、フォーカスが移ってしまいました。                            
続いて2つ目のコードですが、同じTextBoxにカーソルがあり、
2回まででしたら続けて入力することが出来ました。                        
これはメディアプレーヤー起動時(1週目)にはUserFormがアクティブになるのですが、
ソフトが立ち上がっている際にファイルを開くとアクティブにならないようでした。
しかし、カーソルの問題が解決したことでかなり核心に近づけたと思います。
 
核心には近づきましたがまだ私の知識が伴っていない状態ですので
勉強期間をいただくために一旦ここで解決といたします。
良いヒントをたくさんいただいたのでもう少し自分で考えて
また分からないことがあれば改めて質問させていただきたく思います。
 
お二方、この度はご回答ありがとうございました。