[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『vba 画像のトリミング』(ブンちゃん)
今晩は初めまして悩んでいます助けて下さい、200枚ぐらいの
A4に20個ほどの小さい消しゴムほどの商品の写真がありその一つ一つの検索ファイルを
作っています、userformにimageを配置して類似のものを検索して配列しようと考えていますがimageに呼び出しサイズ変更まで出来ましたが指定したleft topまでの移動が解りません、お願いします。
Dim pcname
Dim picname
Sheet1.Activate
pcname = "D:\カタログ.gif"
With Image1
Image1.AutoSize = True
Image1.Picture = LoadPicture(pcname)
.Left = 20
.Top = 50
End With
With Image1
.Width = 50
.Height = 100
End With
お返事お待ちしています、くれぐれもお願いします、
< 使用 Excel:Excel2010、使用 OS:Windows7 >
ところで、アップされたコード、いくつか疑問があるなぁ。
・サイズ変更まで出来ましたが
ほんと?
・With Image1/End With
これは、なにをしているつもり?
・以下は何をしているつもり?
.Left = 20 .Top = 50 .Width = 50 .Height = 100
目的とコードがあっていない気がしてコメントもしづらいけどImageコントロールの
PictureAlignmentプロパティを調べるとImage内での画像のセット位置について
ヒントがあるかも。
http://www.excel-vba.net/excel-userform-005.html
16:57 追記
PictureSizeModeプロパティ なんかも、今回のテーマには便利かも。
(通りすがり) 2014/11/25(火) 11:49
Private Sub UserForm_Initialize()
Dim C As Control
Dim iCou As Long
For Each C In Controls
If C.Name Like "Image*" Then
With C
.Picture = LoadPicture("D:\カタログ.gif")
.Move 20 + 50 * (iCou Mod 10), 50 + 100 * Int(iCou / 10), 50, 100
iCou = iCou + 1
End With
End If
Next
End Sub
(???) 2014/11/25(火) 17:32
Sheet1.Activate 、不要 シートにデータを書き込んでいますので
pcname = "D:\カタログ.gif"
With Image1
Image1.AutoSize = True ’falseの間違いでした
Image1.Picture = LoadPicture(pcname)
.Left = 20 ’userform内のimage位置
.Top = 50 ’userform内のimage位置
End With ’不要
With Image1 ’不要
.Width = 50 ’imageの横サイズ
.Height = 100 ’imageの縦サイズ
End With
End Sub
ユーザーフォームのimageにPictureを貼り付け、サイズ変更しただけです、imageに見えているのは画像の
左上から右に50ピクセル下に100ピクセルです、この50×100のimageを画像の例えば左から200ピクセル、上から200ピクセルに移動して、
一つの商品を表示をしたいのですが無理でしょうか
どうかお願いします。
(ブンちゃん) 2014/11/25(火) 21:01
Imageコントロールだけでは、難しいので・・・・。
1 画像の加工をシート上で行う
対象画像をシート上に表示させ、画像のトリミングと位置決定を行い、表示画像を決定する
2 シート上の画像をユーザーフォームのImageコントロールに表示させる
簡単なのは、Chartから、一度、画像をJPGに保存して、再度、ユーザーフォームのImageコントロール
にLoadPictureを使って表示させる
難しいけど、APIを使ってクリップボード周りでユーザーフォームのImageコントロール
に表示させる
2は、例題があると思います。
1をマクロの記録などを使って、完成させt見てください
(ichinose) 2014/11/26(水) 06:54
・フォームにFrameコントロールを貼ります。
・Frame内にImageコントロールを貼ります。(Image1を切り取り、Frame選択状態で貼り付けてもOK)
・AutoSizeプロパティはTrue。
・Frame位置を移動すると、Imageも追従することを確認。
・FrameのCaptionプロパティの文字を消します。
・マクロでは、Image1.Move -200, -200 のように、トリミング開始位置分引いて指定。
(???) 2014/11/26(水) 10:26
↑ここで Chartを使っての画像の保存(ichinoseの投稿)、
APIを使ってのユーザーフォームへの画像の移行(マナさんの投稿)がありますから、参考にしてください
Frameで不要な部分を隠すという手法、素晴らしいですね!!
(ichinose) 2014/11/27(木) 07:00
Private Sub CommandButton6_Click()
If Cells(1, 14) > 0 Then
For n = 1 To Cells(1, 14)
For i = 1 To sheet2.Cells(1, 9)
If Cells(n, 17) = sheet2.Cells(2 + i, 1) And Cells(n, 18) = sheet2.Cells(2 + i, 2) Then
For j = 1 To 5
Cells(n, 26 + j) = sheet2.Cells(2 + i, 2 + j)
Next j
i = sheet2.Cells(1, 9) + 1
End If
Next i
Next n
End If
For i = 1 To Cells(1, 14)
If i = 1 Then
Cells(1, 33) = Cells(1, 30)
Cells(1, 34) = Cells(1, 31)
End If
If i > 1 Then
Cells(i, 33) = Cells(i - 1, 33) + Cells(i, 30) + 20
If Cells(1, 34) < Cells(i, 31) Then Cells(1, 34) = Cells(i, 31)
End If
Next i
Dim myPic As Shape, myShape As Shape
Dim dbl_mypicW As Double, dbl_mypicH As Double
Dim dbl_myShapeW As Double, dbl_myShapeH As Double
Dim pname
Dim picname
Dim image(10)
Sheet1.Activate
For i = 1 To Cells(1, 14)
Cells(i, 37) = Len(Cells(i, 27))
Cells(i, 38) = "H:\キャスト3" & Right(Cells(i, 27), Cells(i, 37) - 14)
picname = Cells(i, 38)
ActiveSheet.Pictures.Insert(picname).Select
Selection.Name = "pname"
Set myPic = ActiveSheet.Shapes("pname")
Cells(i, 36) = myPic.Width '写真の幅
Cells(i, 37) = myPic.Height '写真の高さ
dbl_CropRight = Cells(i, 36) - Cells(1, 28) - Cells(1, 30)
dbl_CropLeft = Cells(1, 28)
dbl_CropTop = Cells(1, 29)
dbl_CropBottom = Cells(i, 37) - Cells(1, 29) - Cells(1, 31)
With myPic
.PictureFormat.CropRight = dbl_CropRight
.PictureFormat.CropLeft = dbl_CropLeft
.PictureFormat.CropTop = dbl_CropTop
.PictureFormat.CropBottom = dbl_CropBottom
End With
Set myPic = Nothing
Set myShape = Nothing
Next i
End Sub
(ブンちゃん) 2014/12/31(水) 03:23
(通りすがり) 2014/12/31(水) 12:05
>1個では綺麗に出来るのですが、複数になると前の画像が残るのです、 >つまり1枚のA5の台紙を複数の窓で見てる形になり、目的の商品が表示できない
少し試してみましたが、再現が出来ません。
以前、Imageコントロールを使用した時に、近いだろう不具合があった記憶があります(Excel2000)が、 その時は、 PictureプロパティにLoadPicture関数を使って当該画像ファイルをセットする前に
Image1.picture=nothing
又、Imageコントロールを何かの拍子にクリックした後に画像が残る現象が発生しているので
Private Sub Image1_Click()
Image1.Visible = False
DoEvents
Image1.Visible = True
End Sub
なんてコードを試していました。
こんなことで対処できたことを覚えていますが・・・・。同じ現象か否かはわかりませんが。
不具合現象が再現できる 再現手順書を記述してください。
ユーザーフォームにどんなコントロールを配置する からの記述で始まり、 コードや 現象が再現できる操作手順の記述の事です。
(ichinose@今年もよろしくです) 2015/01/05(月) 05:19
Dim pcname
With UserForm6
.Top = 150
.Left = 200
End With
For i = 1 To Cells(1, 14)
If i = 1 Then
pcname = "D:\キャスト\台帳1.gif"
Image1.AutoSize = True
Image1.Picture = LoadPicture(pcname)
Image1.Move -Cells(i, 31), -Cells(i, 30) + 10
With Frame1
.Top = 20
If i > 2 Then
.Left = Cells(i, 37) + 20
Else
.Left = 20
End If
.Width = Cells(i, 32)
.Height = Cells(i, 33) + 20
.Caption = "No." & Cells(i, 17)
End With
End If
If i = 2 Then
pcname = "D:\キャスト\台帳1.gif"
Image2.AutoSize = True
Image2.Picture = LoadPicture(pcname)
Image2.Move -Cells(i, 31), -Cells(i, 30) + 10
With Frame2
.Top = 20
If i > 1 Then
.Left = Cells(i - 1, 37) + 20
Else
.Left = 20
End If
.Width = Cells(i, 32)
.Height = Cells(i, 33) + 20
.Caption = "No." & Cells(i, 17)
End With
End If
If i = 1 Then
pcname = "D:\キャスト\台帳1.gif"
Image3.AutoSize = True
Image3.Picture = LoadPicture(pcname)
Image3.Move -Cells(i, 31), -Cells(i, 30) + 10
With Frame3
.Top = 20
If i > 1 Then
.Left = Cells(i - 1, 37) + 20
Else
.Left = 20
End If
.Width = Cells(i, 32)
.Height = Cells(i, 33) + 20
.Caption = "No." & Cells(i, 17)
End With
End If
Next i
(ブンちゃん) 2015/01/06(火) 02:52
>image(i)のようなことは不可能でしょうか
Controlsコレクションを使うと近いことが可能です。
例 UserForm内に Image1 Image2 Image3 という三つのイメージコントロールがあるとすると、
dim g0 as long
dim pcname as string
pcname = "D:\キャスト\台帳1.gif"
for g0=1 to 3
with controls("Image" & g0)
.AutoSize = True
.Picture = LoadPicture(pcname)
end with
next
こんな記述が可能です。試してみてください。
(ichinose) 2015/01/06(火) 04:53
>userfome1に商品説明を表示したいのですが どこに表示させるのか? にも依ります。 例えば、画像のどれかをクリックしたら Msgboxにて、商品説明を表示するなら
表示させているイメージコントロールの数だけ商品説明をどこかに確保しておきます。 例えば、配列などに
dim mes( 1 to 10) as string 'イメージコントロールの数分宣言する
イメージコントロールに画像を表示するタイミングで 上記のmesにも商品説明を 設定
Private Sub Image1_Click()
msgbox mes(1)
end sub
Private Sub Image2_Click()
msgbox mes(2)
end sub
でよいと思います。
この辺りのコードを纏めるには、 クラスモジュール コントロール配列 等で過去ログを検索してください。
(ichinose) 2015/01/07(水) 07:03
Public WithEvents img As MSForms.image
Public id As Long '何番目のコントロールのペアかを示す数値
userformに
Option Explicit
Private cls(1 To 10) As Class1
Private Sub UserForm_Initialize()
Dim g0 As Long
For g0 = LBound(cls()) To UBound(cls())
Set cls(g0) = New Class1
With cls(g0)
Set .img = Controls("image" & g0)
.id = g0
.img.Min = 1
.img.Max = 10
.img.Smallclick = 1
.img.Value = 1
End With
Next
End Sub
'========================================================================
Private Sub UserForm_Terminate()
Dim g0 As Long
For g0 = LBound(cls()) To UBound(cls())
Set cls(g0) = Nothing
Next
Erase cls()
End Sub
エラーが出ます、変更が間違っているようなのです、お願いします。
(ブンちゃん) 2015/01/10(土) 02:17
>エラーが出ます どの箇所でどのようなエラーが発生しますか?
この辺り、他人が見る(読む)ということを意識して投稿してください。 これを意識することが こういう掲示板でプログラミングの上達につながりますよ(必ず!!)。
>.img.Min = 1
>.img.Max = 10
>.img.Smallclick = 1
>.img.Value = 1
イメージコントロールに上記のような Minとか Maxなんていうプロパティがありましたっけ? 確認してみてください。
>クラスモジュールに
>Option Explicit
>Public WithEvents img As MSForms.image
>Public id As Long '何番目のコントロールのペアかを示す数値
Private Sub img_Click()
'ここにイメージコントロールがクリックされた時のコードを記述します。
End Sub
(ichinose) 2015/01/10(土) 09:53
疑似コントロール配列は、クラスモジュールとかオブジェクトに興味を持つきっかけにすぎません。 ここから大変なので、
最初の疑似コントロール配列のコード例を足し算だけの電卓というプログラムでコード化してみました。
新規ブックにて。
ユーザーフォームを作成してください(UserForm1)。
UserForm1には、ラベルを一つ(Label1)と コマンドボタンを13個(CommandButton1 〜 CommandButton13)を配置してください。 ユーザーフォームの大きさや各コントロールの属性はコードで設定します。
UserForm1のモジュールに
'========================================================================================
Option Explicit
Private cls(1 To 10) As Class1
Private ans As Long
Private Sub UserForm_Initialize()
'ここでは、コントロ−ルの位置や大きさの初期設定やクラスモジュールへの登録
Dim g0 As Long
Dim cap(11 To 13) As String
cap(11) = "C": cap(12) = "+": cap(13) = "="
With Me
.Width = 206.25
.Height = 194.25
.Caption = "たしざんだけの電卓"
End With
With Label1
.Left = 12
.Top = 10
.Width = 168
.Height = 20
.SpecialEffect = fmSpecialEffectSunken
.BackColor = vbWhite
.Font.Size = 14
.TextAlign = fmTextAlignRight
.Caption = "0"
End With
For g0 = 1 To 9
With Controls("CommandButton" & g0)
.TakeFocusOnClick = False
.TabStop = False
.Font.Size = 14
.Left = ((g0 - 1) Mod 3) * 30 + 12
.Top = 96 - ((g0 - 1) \ 3) * 30
.Width = 30
.Height = 30
.Caption = Val(Replace(UCase(.Name), UCase("CommandButton"), "")) Mod 10
End With
Next
With CommandButton10
.TakeFocusOnClick = False
.TabStop = False
.Font.Size = 14
.Left = 12
.Top = 126
.Width = 60
.Height = 30
.Caption = "0"
End With
For g0 = 11 To 13
With Controls("CommandButton" & g0)
.TakeFocusOnClick = False
.TabStop = False
.Font.Size = 14
.Left = 150
.Top = (g0 - 11) * 30 + 36
.Width = 30
.Height = 30
.Caption = cap(g0)
End With
Next
For g0 = 1 To 10
Set cls(g0) = New Class1
With cls(g0)
Set .cmd = Controls("CommandButton" & g0)
Set .lbl = Label1
End With
Next
End Sub
Private Sub UserForm_Terminate()
Dim g0 As Long
For g0 = 1 To 10
Set cls(g0) = Nothing
Next
End Sub
Private Sub CommandButton11_Click()
ans = 0
Label1.Caption = "0"
End Sub
Private Sub CommandButton12_Click()
ans = ans + Val(Label1.Caption)
Label1.Caption = "0"
End Sub
Private Sub CommandButton13_Click()
ans = ans + Val(Label1.Caption)
Label1.Caption = ans
ans = 0
End Sub
次にクラスモジュールを一つ作成してください(Class1)。
Class1のモジュールに
'=====================================================================================
Option Explicit
Public WithEvents cmd As MSForms.CommandButton
Public lbl As MSForms.Label
Private Sub cmd_Click()
Dim vl As String
vl = cmd.Caption Mod 10
If Val(lbl.Caption) <> 0 Or Val(vl) <> 0 Then
lbl.Caption = Format(lbl.Caption, "#") & vl
End If
End Sub
標準モジュールに
'=================================================================
Option Explicit
Sub main()
UserForm1.Show
End Sub
mainを実行して、たしざんだけの電卓を使ってみてください。 尚、この電卓 =ボタンクリックで答えが表示されます。
これは、コントロール配列の完成形ではないのですが、 コントロール配列のしくみやクラスモジュール理解の 参考にしてください。
(ichinose) 2015/01/11(日) 10:36
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.