プロが教えるわが家の防犯対策術!

お世話になります。

ExcelのVBAである処理を実行中に、フォームやその他の方法でもいいのですが、あるフォルダ内の画像ファイルをランダムに表示することは可能でしょうか?

ある処理には、外部データの取り込みでwebの情報を取得し、それを関数で加工して、テキスト形式で排出する処理で、Loopが所々に入っています。

この処理には多少時間がかかります。

その間に、画像ファイルの表示をランダムになるべくなら等間隔で表示させたいのですが、出来るものでしょうか?

処理完了までに時間がプラスされるのは覚悟しています。

要するに、バックではある処理がされ、画面上には写真などがプレビューされるようにしたいということです。何か方法をご存知の方、よろしくお願いいたします。

A 回答 (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
    • good
    • 0

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