• 締切済み

VBAである処理を実行中に・・・

お世話になります。 ExcelのVBAである処理を実行中に、フォームやその他の方法でもいいのですが、あるフォルダ内の画像ファイルをランダムに表示することは可能でしょうか? ある処理には、外部データの取り込みでwebの情報を取得し、それを関数で加工して、テキスト形式で排出する処理で、Loopが所々に入っています。 この処理には多少時間がかかります。 その間に、画像ファイルの表示をランダムになるべくなら等間隔で表示させたいのですが、出来るものでしょうか? 処理完了までに時間がプラスされるのは覚悟しています。 要するに、バックではある処理がされ、画面上には写真などがプレビューされるようにしたいということです。何か方法をご存知の方、よろしくお願いいたします。

みんなの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんにちは。KenKen_SP です。 フォルダ内の画像ファイルパスを配列に読み込んでおき、その要素数内で 乱数を発生させて、画像ファイルを決めます。次に、フォームなら   Me.Picture = LoadPicture(ImagePathArray(Index))   DoEvents で更新します。画像が2回続けて同一にならないようにするためには、 前回表示の画像インデックスをモジュールレベル変数に保持しておいて、 乱数発生時に比較し、同一なら乱数発生をリトライします。 > ...テキスト形式で排出する処理で、Loopが所々に入っています。 あとは、ループ処理の区切りの良いところで以上の仕組みを呼び出せば 良いでしょう。用意する画像はなるべく軽いものがいいですね。 なお下記ソースコードでは画像ファイルのフォルダを固定してます。 ' Userform 1 モジュール------------------------------------------ ' 配置:Image1 CommandButton1 Option Explicit ' 画像ファイルのフォルダ Private Const IMAGEDIR = "C:\Image" ' 画像ファイル名 Private Const IMAGETYPE = "*.jpg" Private mImgPath()   As String ' 画像パスを保存する Private mlngPrevImgIdx As Long  ' 前回表示の画像インデックス Private Sub UserForm_Initialize()   Dim strFilePath As String   Dim i      As Long      ' Image コントロール初期化   With Me.Image1     .PictureSizeMode = fmPictureSizeModeZoom     .PictureAlignment = fmPictureAlignmentCenter   End With   ' 前回表示の画像インデックス初期化   mlngPrevImgIdx = -1   ' フォルダ内の画像ファイルを配列に取得します   strFilePath = Dir(IMAGEDIR & "\" & IMAGETYPE)   i = 0   While strFilePath <> ""     ReDim Preserve mImgPath(i)     mImgPath(i) = IMAGEDIR & "\" & strFilePath     i = i + 1     strFilePath = Dir()   Wend End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)   Erase mImgPath End Sub ' ※ ボタンクリックでご自分のマクロを呼び出す Private Sub CommandButton1_Click()   ' 連続クリック防止   Me.CommandButton1.Enabled = False   Call SampleMacro   ' 最後にフォームを閉じる   MsgBox "完了です", vbInformation   Unload Me End Sub ’今回はややこしくなるので、フォームモジュール内にご自分 ’のマクロを追加して頂く様になってますが、標準モジュール ’からもコールできるように Public にします。 Public Sub ImgChange()   Dim lngImgCount As Long   Dim lngImgIndex As Long   Dim strFilePath As String      ' 乱数を発生させて表示する画像を決める   lngImgCount = UBound(mImgPath)   Do     Randomize     lngImgIndex = Int(lngImgCount * Rnd)   Loop Until mlngPrevImgIdx <> lngImgIndex   ' 画像を Image1 に読み込んで更新   strFilePath = mImgPath(lngImgIndex)   Me.Image1.Picture = LoadPicture(strFilePath)   DoEvents   ' mlngPrevImgIdx を更新   mlngPrevImgIdx = lngImgIndex End Sub Private Sub SampleMacro()   Dim i As Long   Application.ScreenUpdating = False   For i = 0 To 10     ' ※ 次行の画像更新処理をご自分のマクロに追加     Call ImgChange          ' 処理サンプル     ActiveSheet.Range("A1").Offset(i).Value = i     ' サンプルだと早すぎるので仮に入れた Wait     Application.Wait (Now() + TimeValue("00:00:02"))   Next i End Sub

関連するQ&A

  • VBAの処理待ち画面について

    こんにちは VBAの初心者なんです。  VBAのデータ検索処理、超時間がかかりそうです。ですが、検索ボタン押下時に、処理待ち画面を表示させ、検索が終ったら、処理待ち画面を 閉じる仕様になりました 下記のように、なかなかうまくいけませんでした。 Private Sub CommandButton1_Click() 'userform6は処置待ちフォーム userform6.show '検索処理 検索処理() userform6.hide end sub ご存知の方がいらっしゃいましたら、ぜひ、お力を貸していただきたい......

  • 【VBA】セルとシート操作の繰り返し処理

    添付画像のような、5行10列からなる1つの表を、2行間隔で作成しています。 VBAを使って、下記のような繰り返し処理をしたいと思っております。 処理1:シート(1)の表に、1行間隔でセルの塗りつぶし色を付ける。 処理2:このシート(1)をコピーして、test(1)~(6)までの6シートを作成する。     ※コピーしたシート名を「test(1)~(6)」に変更する 処理3:コピーしたtest(2)の「B2」「B11」「B20」「B29」「B38」値を「6」~「10」にナンバリングし、     同様にtest(3)~test(6)のB列の番号も「11」~「30」に変更する VBAを使って、添付画像のようなのような処理1~3の繰り返し行うことは可能でしょうか? うまく説明できず申し訳ございませんが、画像を参考にしていただければと思います。 もし可能であれば、その方法を教えてください。 お手数お掛けいたしますが、よろしくお願い致します。

  • VBAでのユーザーフォームについて。

    初めまして。 今VBAのユーザーフォームでアンケートっぽいものつくってます。 最終的に結果ページをユーザーフォームにて表示させるのですが、 その結果ページのユーザーフォームを画像として保存したいのですが 方法がさっぱりわかりません。 (PrtScを押せばできるのですが処理で行いたいのです。。。) 以上よろしくお願いします。

  • データ処理実行中に処理件数を表示させたい

    こんばんは、ACCESS初心者です。 ACCESSのVBAで、あるデータ処理を行うプログラムを作成しました。 処理件数が多いため、現在処理中の件数をフォーム上に表示させてあげようと、 テキストボックスを配置し、そこへカウンタの値をセットしようと思います。 (カウントアップしているサマをユーザーに見せたい) しかし、ただセットするだけではダメのようで、 再表示的なこと?をしてあげないと表示されない感じなのですが、 処理中にテキストボックスの最新の値を常に表示させるには 何か方法があるのでしょうか? よろしくお願いします。

  • 処理の途中で停止させ、再開させたいです(VBA)

    お世話になります。 フォームのコマンドボタンを押すと、処理が始まるVBAを作成しております。 If DCount("*", "T_データ1") > 0 Then MsgBox ("!データ1が存在します!" & Chr(13) & _ "!データ1一覧を表示します!") DoCmd.OpenForm "F_データ1レコード" ● '住所データを振り分ける Call zyushoCheck テーブルにレコードが存在して、フォームが開いた後(●印のところ)、30秒くらい 次の処理まで時間を置き、時間が経過したら、 Call zyushoCheckを開始させる方法を教えてください。 TimeInterval?でできますでしょうか? どうぞよろしくお願いいたします。

  • VBAのイベント処理について

    VBAのイベント処理について お世話になってます。現在、VBAでアプリケーションを作成しています。 1つのフォームに4つのテキストボックスと1つのボタンが配置されており、それぞれイベントが設定されています。 その中のテキストボックスに関するイベントなのですが、1つのテキストボックスに対してKeyPress、KeyDown、MouseUp、AfterUpdate、以上4つのイベントを作成します。 フォームに配置されている4つのテキストボックスすべてに、上記で示したイベントを作成する必要がありますが、各イベントにおける処理の内容はオブジェクト名が違うだけで全く同じです。 ひとつひとつイベントを作成していけば、処理目的は満たせそうですが、ソースがかなり長くなってしまいます。ひとつのオブジェクトに対してこれらの処理をひとまとめにする様な記述方法はありませんでしょうか?考え方だけでも教えていただければ幸いです。 質問が長くなってしまい申し訳ありません。回答宜しくお願い致します。

  • 【Excel】csvファイル取込み VBA処理

      VBAの初心者です。 csvファイル(カンマ区切り)の取込みをVBAで処理したいのですが、知識がないので 何方か詳しい方ご教授下さい。 動作的には以下のように処理したいと思ってます。 1. sheet1のボタンからテキストのインポート   任意のフォルダ(c:\data\i_data)からカンマ区切りで保存されたcsvファイル群から   選んで読込み。   読込むファイルに間違いがないか対話型で確認のメッセージを表示し、キャンセ   ルした場合は中断させる。 2. csvファイル内の200列分のデータ(指数)をsheet3の任意のセル(指定可能)に取込   み。セルの指定が出来なければ固定でも可ですが、行違いで他のファイルも取込   み出来るようにしたいのです。 色んなサイトからヒントを貰って自分なりに試してますが上手くいかず、行き詰って質 問させて頂いた次第です。 また別のQ&Aに記載されてましたFileSystemObjectが使えません。 お手数ですが、各行毎にコメント(解説)があると有難いです。 Excelのバージョンは"2007"ですが"2000"でも使えるようにしたいのですが・・ よろしくお願いします。

  • vba で全てのエクセルファイルを開く処理

    お世話になります。 下記のVBAソースで、特定のフォルダにあるエクセルを全て 開く処理をしているのですが、スマートに行えているか 疑問に思いました。 具体的には、「'''''''''時間がかかっている??」箇所で 無駄なこと・時間がかかっていないか疑問です。 目的としては、「vba で全てのエクセルファイルを開く処理」ですので、 (1)皆さんがされている「vba で全てのエクセルファイルを開く処理」 (2)下記ソースの「'''''''''時間がかかっている??」は時間がかかっていないか の、どちらかで、結構ですのでご返事頂ければ有り難いです。 宜しくお願いします。 ------------ソース----------------- ChDir (ThisWorkbook.Path & "\" & フォルダ) fileName = Dir("*.xls") Do While fileName <> "" If fileName <> ThisWorkbook.Name Then IsBookOpen = False '''''''''時間がかかっている?? For Each OpenedBook In Workbooks If OpenedBook.Name = fileName Then IsBookOpen = True Exit For End If Next '''''''''時間がかかっている?? If IsBookOpen = False Then Workbooks.Open (fileName) End If End If fileName = Dir() Loop

  • 終了してもプログラムが実行したまま(VB)

    非常に時間のかかる繰り返し処理を行なうプログラムを作りました。どのくらい、プログラムが進行しているのかわかりやすくするため、 Progress.Show でProgressという名前のフォームを表示し、そこに、プログラムが何%終わったのか表示するようにしました。 プログラムはDo Loop文が使ってあるので、何%終わったのかを表示するためにLoopした回数を取得して、それをフォームに表示することにしましたが、どこかで調べたら機械は、Do Loopのあいだはフォーム上に文字を表示するのに手が回らないからDoEventsを使ってイベントを実行させなさい、といわれました。 そこまではうまくいきました。プログラムを実行すると、プログラムが実行されて何%終わったかもちゃんと表示できるようになりました。 ところが、プログラムの実行中にフォームの右上の×ボタンを押したところ、フォームは画面から消え、プログラムが終了したように見えるのに、VB Editorでは[実行中]となっており、終わってくれません。ずっとDo Loopが実行されたままです。 Private Sub Form_Terminate() のところに Unload Progress と書いても、「Unloadメソッドは使えません」などというエラー・メッセージが出ます。(フォーム上にボタンを置き、そこをクリックするとUnloadするようにしてみましたがやはり同じことを言われました。) 原因は何でしょうか? フォームをUnloadする、ということの意味をちゃんと理解していないのでいけないのだと思うのですが、調べてもよく言っていることがわかりません。 よろしくお願いします。

  • vba フォームに取りこんだ画像をシートにコピー

    vba初心者です、宜しければ教えて下さい。 ユーザーフォーム上に画像をドラッグドロップしたら、その画像、ファイル名、パス名がフォーム上に表示されるところまで作成しました。以下のサイトをそのままですが、参考にさせてもらいました。 (参考サイト:https://www.excel-pitin.net/single-post/2017/08/06/画像をドラッグ&ドロップで表示させる) このImage1オブジェクトに上書きした画像を別シートの指定セルA1に貼り付ける方法を知りたいです。いました。 保存後に画像のパスが変わっても表示が崩れないようにしたいので、Picture.insertではなくShapes.AddPictureを使うというところまで、調べたのですが、そこから先で詰まってしまい、分かりません。(参考https://excel-ubara.com/excelvba5/EXCELVBA226.html ) 最終的には、ユーザーフォーム上のプレビュー画像に ・ボタン操作で、画像を拡大縮小する ・マウスでドラッグして位置を直接微調整する 機能も付けれればなと思っています。 宜しければご教授お願いします。

専門家に質問してみよう