[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『画像圧縮の方法』(やっぱり初歩)
取込んだ画像の圧縮方法や理屈が知りたくて過去ログをググッていました。 1ヶ月ほど前の[[20150525120558]]を興味深く見ていましたが良く分かりません。 回答者のデイトさん、マナさんの書かれている内容も理解出来ませんでした。
【分からない所】を★印で示しています。又、私なりに理解した事を注釈へ(間違っているかも)
Sub 複数画像の挿入3() Dim input_picture As Range, c As Range Dim pkfile Dim fi As Long Dim ok As Boolean, Cent_OK As Boolean Dim mySp As Shape
On Error Resume Next Set input_picture = Application.InputBox("画像を挿入するセルを選択してください" _ & Chr(13) & Chr(10) & "複数選択可 (ShiftキーまたはCtrlキーで選択)" _ , "複数画像の一括挿入(セル選択)", Selection.Address, , , , , 8) On Error GoTo 0 If input_picture Is Nothing Then Exit Sub
pkfile = Application.GetOpenFilename _ ("すべての図(*.emf;*.wmf;*.jpg;*.jpeg;*.jfif;*.jpe;*.png;*.bmp;*.gif;*.eps), *.emf;*.wmf;*.jpg;*.jpeg;*.jfif;*.jpe;*.png;*.bmp;*.gif;*.eps", 2, "挿入する図の選択(複数選択可)", , True) If Not IsArray(pkfile) Then MsgBox "ファイルが指定されていません", , "複数画像の一括挿入": Exit Sub
fi = 1
If MsgBox("縦横比を保持しますか", 4, "複数画像の一括挿入") = 6 Then ok = True Else ok = False If ok Then If MsgBox("センタリングしますか?", 4, "複数画像の一括挿入") = 6 Then Cent_OK = True Else Cent_OK = False End If
Application.ScreenUpdating = False
For Each c In input_picture '★↓この2個の内の右側のAddress は何なのか?又、この比較の意味する所は? ' → 最大の不明点 c.MergeArea云々(メンバー)が分かりません。そのものも?・・・ '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If c.Address = c.MergeArea(1).Address Then Set mySp = ActiveSheet.Shapes.AddPicture( _ Filename:=pkfile(fi), _ LinkToFile:=False, _ SaveWithDocument:=True, _ Left:=c.MergeArea.Left, _ ★Left:=c.Left としても良いのでは?※条件が一致し、記述が簡素 Top:=c.MergeArea.Top, _ ★Top:=c.Top 上記同様 Width:=-1, _ ★デイトさん仕様:0 Height:=-1) ★何が違うのか?(不明な為試行せず)
セルにサイズを合わせる3 mySp, c.MergeArea, ok, Cent_OK 図の圧縮3 mySp
fi = fi + 1 If UBound(pkfile) < fi Then Exit Sub
End If Next c Application.ScreenUpdating = True
End Sub
Sub セルにサイズを合わせる3(sp As Shape, rng As Range, ok As Boolean, Cent_OK As Boolean) Dim rX As Single, rY As Single Dim cx As Single, cy As Single
With sp rX = rng.Width / .Width 'セル:画像 幅/高さの比率 rY = rng.Height / .Height If ok = True Then '縦横比維持で分岐 If rX < rY Then cx = .Width * rX cy = .Height * rX Else cx = .Width * rY cy = .Height * rY End If Else .LockAspectRatio = msoFalse cx = rng.Width cy = rng.Height End If If Cent_OK = True Then 'センタリングで分岐 .Width = cx .Height = cy .Left = rng.Left + (rng.Width - .Width) / 2 .Top = rng.Top + (rng.Height - .Height) / 2 Else .Width = cx .Height = cy .Left = rng.Left .Top = rng.Top + rng.Height - .Height End If End With End Sub
'★2番目の疑問…Cut&Copyが何故『図の圧縮』となるのか ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub 図の圧縮3(sp As Shape) Dim L As Double, T As Double
With sp L = .Left T = .Top .Cut End With With ActiveSheet .PasteSpecial Format:="図 (JPEG)", Link:=False, DisplayAsIcon:=False With .Shapes(.Shapes.Count) .Left = L .Top = T End With End With End Sub
この様に少しでも深く知りたくて質問しました。よろしくお願いします。
< 使用 Excel:Excel2013、使用 OS:Windows8 >
マナさん、デイトさんからお答えいただくのが筋ですが、なかなか寝付けないので、わかる範囲で。
'★↓この2個の内の右側のAddress は何なのか?又、この比較の意味する所は? ' → 最大の不明点 c.MergeArea云々(メンバー)が分かりません。そのものも?・・・
選択されたセル範囲が input_picture に入っていて、そこからセルを1つずつ、Range変数の c に取り出していますね。 で、取り出した c ですけど、もしかしたら単一セルかもしれませんし、結合セルの中の一部かもしれません。 単一セル.MergeArea は もし、結合セルではなかったら 単一セルと同じものです。ですから両者のAddressは同じです。(たとえば $D$10) もし、結合セルの中の一部であれば、c.Address が たとえば、$D$10 、 c.MergeArea.Address が $C$5:$E$15 といったように、cが属する結合セル領域になります。 で、c.MergeArea(1).Address は、その属する結合セル領域の最初のセル(左上隅のセル)になります。↑の例なら $C$5。 ですから、If c.Address = c.MergeArea(1).Address Then は、もし結合セルなら、その左上隅のセルの場合にのみ処理ということをしていますね。
★Left:=c.Left としても良いのでは?※条件が一致し、記述が簡素 ★Top:=c.Top 上記同様
ここは、ご指摘通りですね。結合セル領域の場合、その左上隅のセルの場合にのみ処理していますのでc.Leftも、c.MergeArea.Left も同じ値ですね。(Topもしかり)
★デイトさん仕様:0 ★何が違うのか?(不明な為試行せず)
AddPictureの引数として Width や Height は省略不可。何かしら与える必要があります。 -1 とすると、オリジナルの値を継承するようです。 いったん 0 にしておいて、そのあとで元のサイズにあわせるコードを書いてもいいです。
(β) 2015/07/06(月) 00:17
勝手ながらリンクを貼らせていただきます。
[[20150525120558]]? 『結合したセルの画像圧縮』(BBB)
(カリーニン) 2015/07/06(月) 00:25
>単一セル.MergeArea は もし、結合セルではなかったら 単一セルと同じものです。ですから両者のAddressは同じです。(たとえば $D$10) >もし、結合セルの中の一部であれば、c.Address が たとえば、$D$10 、 c.MergeArea.Address が $C$5:$E$15 といったように、cが属する結合セル領域になります。 >で、c.MergeArea(1).Address は、その属する結合セル領域の最初のセル(左上隅のセル)になります。↑の例なら $C$5。 >ですから、If c.Address = c.MergeArea(1).Address Then は、もし結合セルなら、その左上隅のセルの場合にのみ処理ということをしていますね。
何とか理解は出来ましたが、更なる疑問が出てきました。結合セルでは試行していませんでした。 これを試した所、If c.Address = c.MergeArea(1).Address ←両方のAddressは左上隅となり、単独セルと同様に同じAddressを示します。 ↓ ↓ ↓ 私には絶えず同じ結果になるのではないかと疑問に思いました。 ・異なる結果(違うAddress)とはどの様な時なのか? ・もし、絶えず同一Addressならば If文は必要としない。 ※不要な事はされないと思いますので、私の勘違いと考えます・・・
私が理解出来ない根本的原因は、Rangeのメンバーで普通に使用するAddressとMergeArea.Addressとでは 何がどう違うか分かっていない事です。 恐縮ですが私にも理解できるように噛み砕いたご教授をお願いします。
(やっぱり初歩) 2015/07/06(月) 10:46
>>結合セルでは試行していませんでした。
もともとが、参照されたトピでは
>>セルを結合していない状態では問題ないのですが、セルを結合した状態で >>画像を貼り付けると、圧縮のところでうまく動作していないようです。
という課題があって、その解決のために回答されたコードですから、当然、結合セルの場合の判断ロジックがはいっているわけです。
もし、(やっぱり初歩)さんが、それは不要だということなら、これらを取り除いてすべてが単一セルの状態でのコードにすれば 当然、シンプルになりますね。
>>私が理解出来ない根本的原因は、Rangeのメンバーで普通に使用するAddressとMergeArea.Addressとでは >>何がどう違うか分かっていない事です。
説明するともっとわかりにくくなるかもしれませんので以下のマクロ君に説明してもらいます。 でてくるメッセージとマクロ内のコードをつきあわせてみてください。
新規ブックに
Sub Test() Cells.UnMerge
MsgBox "今から B5:F20 の結合セルをつくります"
Range("B5:F20").Merge
MsgBox "この中のC10の状況は" & vbLf & _ "所属している領域:" & Range("C10").MergeArea.Address & vbLf & _ "その左端:" & Range("C10").MergeArea.Left & vbLf & _ "一方 C10そのものは" & vbLf & _ "その左端:" & Range("C10").Left
MsgBox "結合セルの左上隅のセルは " & Range("C10").MergeArea(1).Address & " です" & vbLf & _ "ですから C10 が左上隅かどうかの判定は " & (Range("C10").MergeArea(1).Address = Range("C10").Address) & " です"
MsgBox "ちなみに B5 が左上隅かどうかの判定は" & (Range("B5").MergeArea(1).Address = Range("B5").Address) & " です"
MsgBox "ところで単一セルである B2 を見てみますと" & vbLf & _ "その「結合領域」のアドレスは " & Range("B2").MergeArea.Address & "ですから" & vbLf & _ "この場合、単一セル領域 = そのセルが属する結合領域になります。おわかりいただけましたか"
End Sub
(β) 2015/07/06(月) 12:02
ベータさん 早速のご回答有難うございます。直ぐにテストさせていただきました。 理解するのに30分ほど掛かりましたが何とか分かりました。
>"所属している領域:" & Range("C10").MergeArea.Address & vbLf & _ >"その左端:" & Range("C10").MergeArea.Left & vbLf & _ ⇒ 54 >"一方 C10そのものは" & vbLf & _ >"その左端:" & Range("C10").Left ⇒108
MergeAreaとは連結セル中にあるセル位置情報がポイントAddressとして出て来ている様ですね。 新規ブックの列幅は72ピクセルとなっていて、72×72÷96 = 54 の結果を得ました。 つまり、エクセルウィンドの左端位置からの距離に等しくなって来たのです。 この様な理解で宜しいでしょうか。 有難うございました。
(やっぱり初歩) 2015/07/06(月) 13:11
>> MergeAreaとは連結セル中にあるセル位置情報がポイントAddressとして出て来ている様ですね。
?????
そうではなく、セル.MergeArea は、そのセルが属する、結合セル領域の Rangeオブジェクトです。 ポイント値は セル領域(あるいはセル).Left とか .Top とか .Width とか .Height といった、そのRangeオブジェクトに属するプロパティがありますが そういったプロパティに入っている値です。 .Address もプロパティの1つにすぎません。そこには文字列で、アドレスが入っています。
で、ついでにふれておきますと .Left や .Top は、シート全体の左上隅(つまり、A1 の左上隅)から、どれぐらい 離れているかというx座標、y座標 で、ポイント値というもので格納されています。 こういった座標を【ドキュメント座標】と呼びます。A1からの変位ですから、画面をスクロールさせても、 この値はかわりません。 一方、デスクトップ画面の左上隅からどれだけ離れているかという座標もあります。スクリーン座標とかWindow座標と呼びます。 API関係は、この座標を使っています。この値は、ほとんどピクセル値であらわされます。 例外は、ユーザーフォームの表示位置、これもスクリーン座標ですが、このLeftやTopはポイント値になっています。
(β) 2015/07/06(月) 13:21
βさん 又しても私の早合点でした。MergeArea.Address とMergeArea.Left を混同してしまいました。 恥ずかしながらも、『Merge』も『Marge』と勘違いしていました。最初から間違った理解をしていました。 何で余白が関係するのかと少々疑問に思いつつも、直ぐにその事を調べもせず進めておりました。 各座標軸の説明もして頂き感謝します。20年ほど前にQuick Basicで見た事がありますが忘れています。 近年よく見かけるTwipps(?)も有りますが、ピクセルとの関係が分かりません。
回答者さん達の奥深い知識や洞察力には頭が下がります。質問者自身が説明に困る内容でさえ良く把握し、 アドバイスや手法の提示をされているのを見るにつけ『無料相談所』のこのサイトは大変貴重に思います。 私もこれからは極力、質問内容を明確で簡素に、そして自分の問題を現して行きたいと思います。 ※少々意味は違えど『次工程はお客様』の精神を貫きたいと思います。
アルツハイマー病の兆候が見受けられる初老を通り越した『中老(間もなく64歳)』ですが今後共ご指導 の程、よろしくお願いします。
(やっぱり初歩) 2015/07/06(月) 14:10
質問も終わったのかな?と言った所で雑談です。 すごく変な(誰も気に留めないだろう)所に突っ込みます。 > 『無料相談所』 個人的にはこの場は「学校」と見ているので、すごく違和感を覚えました。 無料で相談する所。 確かにそうなのだろうけど、ものすごく受け身な表現な気がして、何故だかちょいと悲さも。 回答する人はその培ってきたノウハウと、時間と言う代替のない貴重な物を使ってくれている、 それを無料と言い切ってしまうのは抵抗がある。 いやもちろんやっぱり初歩さんがそんな意味で書いているわけじゃない事も、 極力誤解の無いよう詳細を記述し時間を掛けた質問文や、 『次工程はお客様』という言葉から、受身一辺倒ではないであろう事も 承知ではありますが。 誰もが教え、学びあう。 そんな場をイメージできる「学校」と言う名称が 他の質問系のサイトとは違うよなぁ、と。 そんな空気が気に入って いつまでもちょいちょい登校している 不登校気味の一学生からの戯言でした。 (ご近所PG) 2015/07/06(月) 14:42
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.