2016-12-10 4 views
0

vbaフォームに3枚の画像があります。
画像は(picture1、picture2、およびselectedImage)VBAフォーム上の画像の画像プロパティを設定する問題

VBAは、選択された画像と等しいpicture1またはpicture2を設定します。 Picture1とPicture2は(none)に初期化され、selectedImageはローカルビットファイルに設定されます。 「Picture1.Picture = selectedImage.Picture」が実行されている、まだ画像が更新されていない...

すべてのヘルプは大歓迎だろう

Private Sub updatePicture(position As Integer) 

'This code works when un-commented out and run 
    'Picture1.Picture = selectedImage.Picture 

'This code does not update the images 
    If position = 1 Then 
     Picture1.Picture = selectedImage.Picture 
    ElseIf position = 2 Then 
     Picture2.Picture = selectedImage.Picture 
    End If 

End Sub 

私は、デバッグおよび位置= 1確認、およびライン。 excelの使用2013年

+0

かどうかを明確にするためにあなたの質問を更新してください:

Option Explicit Public Event PictureChanged(img As MSForms.Image, pic As Object) Public Sub SetPicture(img As MSForms.Image, pic As Object) If img Is Nothing Or pic Is Nothing Then Exit Sub If img.Picture Is pic Then Exit Sub RaiseEvent PictureChanged(img, pic) End Sub 

あなたUserformの背後にあるコード、そして、そのようなイベントをトリガーとハンドルますImageコントロールは 'selectedPicture'または' selectedImage'と呼ばれます。 –

+0

混乱して申し訳ありませんが、コードは正しいです...画像コントロールが選択されています画像 –

答えて

0

このタイプの問題は、多くの場合、Imageピクチャへの変更がイベントを発生させないという事実に関連しています。プロシージャに1または2を確実に渡しているとします(確実に確認する必要があります)。再ペイントの問題を処理するには、いくつかの方法があります。Repaintメソッドを(例えば進捗モニターや複数のクリック取り扱い上)

If position = 1 Then 
    Picture1.Picture = selectedImage.Picture 
ElseIf position = 2 Then 
    Picture2.Picture = selectedImage.Picture 
End If 
Me.Repaint 

はしかし、これはUserformあなたの全体を再描画し、あなたが急速に絵を更新する場合はちらつきが発生することがありますかあります:あなたのコードの下には、ので、あなたの手順を読んでいました巨大なUserform

もう1つの方法は、イベントを作成し、そのイベントを通じて新しい画像を実行することです。私は権限の位置からこれを言うことはできませんが、私の印象は、Eventが再塗りを強制し、変更が検出されたUserformの部分をリフレッシュするように見えるということです。この方法ははるかにスムーズです。

これを行う方法は非常に簡単です。新しいClassを挿入し、適切に名前を付けます(私はという名前です)。clsPicHandler)。そのクラス内のコードは、このように少しかもしれない:

Option Explicit 

Private WithEvents mPicHandler As clsPicHandler 

Public Sub UpdatePicture(position As Integer) 
    If position = 1 Then 
     mPicHandler.SetPicture Picture1, selectedImage.Picture 
    ElseIf position = 2 Then 
     mPicHandler.SetPicture Picture2, selectedImage.Picture 
    End If 

End Sub 

Private Sub mPicHandler_PictureChanged(img As MSForms.Image, pic As Object) 
    img.Picture = pic 
    DoEvents 
End Sub 

Private Sub UserForm_Initialize() 
    Set mPicHandler = New clsPicHandler 
End Sub