Excel (VBA) |
![]() ![]() |
(Windows 10 Pro : Excel 2016)
.leftで得られる数値と各列のピクセルの関係
投稿日時: 20/11/06 11:51:49
投稿者: m-i-kss
|
---|---|
初めて質問します。
For col = 2 to 10 debug.print (columns(col).left - columns(col - 1).left ) * 2 Next col これで、各列幅がピクセル値で得られると思ったのですが違うようです。 高さのピクセルと高さの数字 との関係と、 幅のピクセルと幅の数字 との関係が異なることもさっき知ったレベルなので、 思い込んでいた定義そのものが違うとしか思えません。 .leftってなんでしょう?単位とかあるのでしょうか? 左側に非印字エリアがあるとか、そういう条件でずれるのでしょうか? |
![]() |
投稿日時: 20/11/06 13:33:16
投稿者: Suzu
|
---|---|
m-i-kss さんの引用: Top、Left、Height、Width の単位は ピクセル ではなく、ポイントです。 https://docs.microsoft.com/ja-jp/office/vba/language/glossary/vbe-glossary#point 『ポイント 1/72 インチ。 通常、フォント サイズはポイントで測定されます。』 https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.top https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.left https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.height https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.width Range("A2").Top - Range("A1").Top も「ポイント」になります。 行の高さは、マウスにて 画面左の 1〜の行番号の間の仕切りをドラッグする要領で 左クリックをしたままの状態にすると表示されます。 行番号を右クリック 行の高さ で表示されるのも、「ポイント」となります。 対して Range("B1").Left - Range("A1").Left も 「ポイント」ですが 列番号を右クリック 列の幅 で表示されるのは、「文字幅」になります。 https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.columnwidth 『1 単位の列幅は、標準スタイルの 1 文字の幅に等しくなります。 』 【ピクセル?ポイント?Excelで使われる単位の話】 https://allabout.co.jp/gm/gc/297706/ が参考になると思います。 |
![]() |
投稿日時: 20/11/06 13:42:07
投稿者: WinArrow
|
---|---|
Excelでは
|
![]() |
投稿日時: 20/11/06 14:20:56
投稿者: m-i-kss
|
---|---|
ありがとうございます。
Sub test() Dim Base As Double Dim Height As Double Dim freeform As FreeformBuilder Dim Row As Integer Set freeform = _ ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, Columns(2).Left, Rows(2).Top) For Row = 2 To 5 Base = Columns(Row).Left Height = Rows(Row + 1).Top - Rows(Row).Top '.Heightとか知りませんでした freeform.AddNodes msoSegmentLine, msoEditingAuto, 250, Rows(Row).Top + Height / 2 freeform.AddNodes msoSegmentLine, msoEditingAuto, Base, Rows(Row + 1).Top Next Row With freeform.ConvertToShape.Line .Weight = 0.5 .ForeColor.RGB = vbRed End With End Sub 見様見真似なのですが、こういうコードを作って、 頭の中ではジグザグの始点・終点・曲がり角がセルを囲むグレーの線の交点上に来て、 頂点とでも呼ぶべき点が各列の高さの中央に来るイメージでした。 A1〜E5まで、各列の列幅や高さがバラバラでも問題なく交点上に来るかと思いきや、 それができるシートと、 これを別のシート上で走らせると微妙にずれるシートがあるために今回の質問に至りました。 きっちり交点上に来るために、何が必要なのでしょうか? |
![]() |
投稿日時: 20/11/06 15:15:08
投稿者: Suzu
|
---|---|
m-i-kss さんの引用: freeform.AddNodes msoSegmentLine, msoEditingAuto, 250, Rows(Row).Top + Height / 2 こちら、X方向 250で固定なのですが良いのでしょうか? ご希望の形状について想像がつかないのですが、なんとなくで。。 Sub Sumple() Dim cnt As Long Dim freeform As FreeformBuilder With ActiveSheet.Range("B2") Set freeform = ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, .Left, .Top) For cnt = 0 To 3 With .Offset(cnt, cnt) freeform.AddNodes msoSegmentLine, msoEditingAuto, .Left + .Width / 2, .Top + .Height / 2 freeform.AddNodes msoSegmentLine, msoEditingAuto, .Left, .Offset(1, 0).Top End With Next cnt End With With freeform.ConvertToShape.Line .Weight = 0.5 .ForeColor.RGB = vbRed End With End Sub |
![]() |
投稿日時: 20/11/06 15:56:09
投稿者: m-i-kss
|
---|---|
ありがとうございます。
|
![]() |
投稿日時: 20/11/06 16:14:00
投稿者: WinArrow
|
---|---|
Excelでhポイントで指定するが、結局は、ピクセルに変換されて画面表示となります。
|
![]() |
投稿日時: 20/11/06 17:05:07
投稿者: Suzu
|
---|---|
引用: という事は、「シート」 極端に言うと、「セル」の設定によって決まる。 違いを比べてみては如何でしょうか。 セルの設定で、位置や、幅・高さ に影響を及ぼす 事項として思いつくのは 行・列 が非表示になっている セルの書式設定 [配置] 文字の配置/文字の制御/方向 [フォント] フォント名/文字飾り [罫線] 罫線種類 |
![]() |
投稿日時: 20/11/06 17:21:31
投稿者: チオチモリン
|
---|---|
※ 高さの場合
|
![]() |
投稿日時: 20/11/06 19:20:24
投稿者: simple
|
---|---|
チオチモリンさんのTips興味深く拝見しました。
|
![]() |
投稿日時: 20/11/07 00:57:59
投稿者: チオチモリン
|
---|---|
>実際の高さは、Heightで表現されるものになる
|
![]() |
投稿日時: 20/11/07 07:09:40
投稿者: simple
|
---|---|
チオチモリンさんがおっしゃっているのは、
Sub Macro1() 'Heightをそのまま使用 Dim shp As Shape Dim l#, t#, w#, h# Dim k As Long For k = 1 To 30 l = 310 + (k - 2) * 20 ' ■■ t = Cells(k, 1).Top w = 20 h = Rows(k).Height ' ■■ Set shp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, l, t, w, h) With shp.Line .Visible = msoTrue .Weight = 0.25 End With shp.Fill.Visible = msoFalse Next End Sub Sub Macro2() 'Rowheightを使用(試験実施) Dim shp As Shape Dim l#, t#, w#, h# Dim k As Long For k = 1 To 30 l = 360 + (k - 2) * 20 ' ■■ t = Cells(k, 1).Top w = 20 h = Rows(k).RowHeight ' ■■ Set shp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, l, t, w, h) With shp.Line .Visible = msoTrue .Weight = 0.25 End With shp.Fill.Visible = msoFalse Next End Sub 【観察】 ズームで拡大すると分かる程度ですが、 macro2は接合点で若干の食い違いが生じます。 これに対して、macro1はそうした不一致はなく、スムーズです。 このことから、実際に行の高さとして設定されているのは、Heightに近いと思います。 (RowHeightは論理上の高さ、 Heightは描画ピクセルが離散的なことを考慮して調整されたあとの、実際の高さ、 とでも呼べるかもしれません。環境によって変化します。) ですから、 Rangeに対して、Left,Top,Height,Widthなどのmetricsを一貫して適用して位置を測定し、 それに基づいて図形描写を行う限りにおいては、 質問者が指摘されるような齟齬は発生しないように思います。 (別の環境に移した時に挙動が変わるといった話は除きます。) いやそうでもないというのであれば、 質問に至った事象が再現できるコード一式を提示していただくとよいと思います。 |
![]() |
投稿日時: 20/11/07 13:57:00
投稿者: チオチモリン
|
---|---|
そうでした。
|
![]() |
投稿日時: 20/11/07 15:01:13
投稿者: WinArrow
|
---|---|
RowHeight と Height の違いについて
|
![]() |
投稿日時: 20/11/07 15:13:02
投稿者: WinArrow
|
---|---|
お穴痔大きさの図形をシートに作成する場合の工夫
|
![]() |
投稿日時: 20/11/09 09:02:56
投稿者: m-i-kss
|
---|---|
週末に確認ができなかったので、今朝確認し
|