FC2ブログ

Excelじゆうちょう

Excelのお絵描きツール『りっぷ2(りっぷつぅ)』のサポートページ、まずは「はじめに」をご覧ください。 [NewEntry] [Admin]

記事更新カレンダー

10 « 2018-11 « 12
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

やたらに多いカテゴリ

比較的新しい記事

新しいコメント

ありがたいブログ拍手

拍手コメント一覧(拍手はしない)

さみしいトラックバック

申し訳ないプロフィール

申し訳ない

管理人  [ 申し訳ない ]

pxivもやってます
リンクの一番上からのぞきに来てください
※閲覧にはユーザー登録が必要です

RSSってなんぞ?

広告は消せないらしい

FC2Ad

        --------       スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

        2011-03-28       アクティブセルの幅を変更

この前の記事 に追伸。

やっぱり実際にセル幅を変更するコードもあった方がいいですね。
というわけで、以下に紹介しておきます。
アクティブセルの縦と横をピクセルで指定した幅に変更します。
これなら、Windowsのフォントサイズ(DPI)を変更していても、標準のフォントを変更していてもちゃんと指定したピクセルから変換できるはずです。

ついでに、縦の設定横の設定を色分けしてみました。
文字幅がいかにまどろっこしいかがお分かりになるかと思います。


'【コードウインドウ】
Private Declare Function GetDeviceCaps Lib "gdi32" _
  (ByVal hDc As Long, ByVal nIndex As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Sub ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDc As Long)

Public Sub setActiveCellSize() 'アクティブセルの幅を変更
Dim PixelToPoint_y As Single ,PixelToPoint_x As Single 'ピクセルをポイントへ変換
Dim hWnd As Long, hDc As Long 'ハンドル
Dim Row_size As Long, Col_size As Long, Font_width1 As Long, Font_width2 As Long
Row_size = CLng(Val(InputBox("アクティブセルの縦幅をピクセルで指定"))) '縦
Col_size = CLng(Val(InputBox("アクティブセルの横幅をピクセルで指定"))) '横
If 0 < Row_size And 0 < Col_size Then '幅は0ピクセル以上
  hWnd = Excel.Application.hWnd 'ハンドル取得
  hDc = GetDC(hWnd) 'ハンドル取得
  PixelToPoint_y = 72 / GetDeviceCaps(hDc, &H58&) '乗算でポイント変換
  PixelToPoint_x = 72 / GetDeviceCaps(hDc, &H58&) '除算でピクセル変換
  ReleaseDC hWnd, hDc 'ハンドル解放
  With ActiveCell
    .RowHeight = Row_size * PixelToPoint_y '縦(ポイントへ変換)
    .ColumnWidth = 1# '1文字分の列幅
    Font_width1 = CLng(.Width / PixelToPoint_x) '[余白]+[実幅]
    .ColumnWidth = 2# '2文字分の列幅
    Font_width2 = CLng(.Width / PixelToPoint_x) '[余白]+[実幅]+[実幅]
    If Font_width1 < Col_size Then '変更後が1文字分の幅より大きければ
      .ColumnWidth _
        = (Col_size - Font_width1) / (Font_width2 - Font_width1) + 1# '横(文字幅)
    Else
      .ColumnWidth = Col_size / Font_width1 '横(文字幅)
    End If

  End With
  MsgBox "縦 " & Row_size & " ピクセル、横 " & Col_size & " ピクセル"
Else
  MsgBox "セルの幅が不正です"
End If
End Sub


↓まずは実行↓
アクティブセル幅変更、実行

↓縦のピクセル数を入力(この後64を入力)↓
アクティブセル幅変更、縦

↓横のピクセル数を入力(この後32を入力)↓
アクティブセル幅変更、横

↓おしまい↓
アクティブセル幅変更、完了

このコードは最低限です、対象のセルを変更したりピクセル数の取得方法を変更したりすれば、そこそこ使い勝手が増すのではないでしょうか?
スポンサーサイト

        2011-03-24       列の文字幅一覧

このカテゴリ 久しぶりですね、簡単におさらいしましょう。

セルの縦幅は、ポイントで設定します。
ポイントは、Windowsのフォントサイズ(DPI)と組み合わせてピクセルと相互に変換できます。
詳しい解説は割愛しますが、デフォルトの100%は96DPIで「ポイント / 96 = ピクセル / 72」の関係があります。
上の式を変形すれば、ピクセルとポイントを相互変換できます。
※72の値は定数と覚えましょう

ポイント = ピクセル * 72 / 96
ピクセル = ポイント * 96 / 72

これにより、Windowsのフォントサイズが変わればピクセルの値もつられて変動してしまいます。
Windowsのフォントサイズはマクロで取得できますが、これもここでは割愛します。
今回の肝はセルの幅を設定するもうひとつの単位、文字幅です。

セルの文字幅とは、Excelのブックごとに設定される標準のフォントの半角数字「0」のポイント数を意味します。
例えば、文字幅が8.38のセルがあるとすると、そのセルにはフォントを変更していないデフォルト状態の半角数字「0」が8.38文字分きっちり収まります。
さらに、この文字幅には余白と実幅があって、単純に「セルの文字幅 = 標準の文字幅 * 文字数」とはなりません。

↓HG丸ゴシックM-PRO、フォントサイズ11、太字なしの場合↓
文字幅詳細

以上がこれまでのおさらいです。
今回は文字幅の具体的な計算方法を確認することにしましょう。

セルの文字幅の内訳はこうです。

セルの文字幅1 = 余白 + 実幅
セルの文字幅1 = 余白 + 実幅 * 2
セルの文字幅1 = 余白 + 実幅 * 3
    …

セルの幅の大きさについては、「ActiveCell.ColumnWidth」でアクティブセルの文字幅を、「ActiveCell.Width」でアクティブセルの文字幅のポイント数を取得できます。
ただし、値を設定して列幅を変更できるのは「ActiveCell.ColumnWidth」だけです。
また、残念なことに余白と実幅を直接求める方法を私は知りません。
ですので、仕方なしにこうします。

実幅 = セルの文字幅2 - セルの文字幅1
余白 = セルの文字幅1 - 実幅

さらに、残念なことにセルの文字幅は実際に設定されているセルより取得する方法しか私は知りません。
ですので、いったん文字幅を1にして値を取得し、続けて文字幅を2にした時の値とで、余白と実幅を算出します。
そうやってようやく、セルの文字幅とポイントを相互変換できるようになります。
ポイントと変換ができれば、ピクセルとも可能ですよね。

「セルの文字幅 ⇔ ポイント ⇔ ピクセル」といった感じです。
申し訳ないですが、直接「セルの文字幅 ⇔ ピクセル」は諦めてください。

最後に、計算方法を紹介します。

↓MSゴシック、フォントサイズ11、太字なし、DPI96の場合↓
列の文字幅一覧

標準のフォントやDPIが変われば、文字幅1のポイント数が変化します。
それに合わせて水色の部分を変更し、計算式と数式の参照を合わせてやればちゃんと求められます。
これを見ると気付くのですが、文字幅は計算結果の小数第3位を四捨五入した値なんですね。

        2009-10-15       文字幅とピクセルの関係

前回、セルの幅の変更には文字幅という単位が使われ、文字幅はフォントの種類によって異なると説明しました。
まずは、これについて補足しておきます。

フォントの種類はセルごとに自由に変更できますが、上で言うところのフォントの種類とは、ブックの標準のフォントを指しています。
新規でブックを開いた時に設定されているフォント、セルの書式をクリアした時に元に戻るフォントが、標準のフォントです。
Excelのデフォルト設定では、MS Pゴシックがフォントサイズ11になっています。
この設定は以下のようにして変更することも可能です。(私は等幅フォントが好きですので、MS ゴシックにしています)

■Excel2003以前の場合
メニューの[ツール(T)]→[オプション(O)]→オプションのダイアログボックスの表示→[全般タブ]→[標準フォント(A)]と[サイズ(E)]

↓こんな感じ↓
標準フォント設定(Excel2003)

話がそれてしまいますが、[カレントフォルダ名(D)]は変更しておくことをぜひおすすめします!
カレントフォルダとは、簡単に言うと現在選択しているフォルダのことで、ブックを開いたり保存したりしようとした時にダイアログボックスに表示されるフォルダのことです。(確か、Excelのデフォルトはマイドキュメントだったような?)
もし、Excel専用のフォルダを用意してるなら、毎回保存フォルダを変更する手間が省けます。

■Excel2007の場合
[Microsoft Office ボタン]→[Excelのオプション(I)]→Excelのオプションのダイアログボックスの表示→[基本設定]→[使用するフォント(N)]と[フォントサイズ(Z)]

↓Excel2007だとこう↓
標準フォント設定(Excel2007)



それでは、話を文字幅に戻します。

1文字の幅+1文字の幅=2文字の幅が成立しない!↓
フォント幅比較

上の例は、MS ゴシック、フォントサイズ11、太字なしの場合です。
文字幅1では13ピクセルですが、文字幅2だと13*2=26ピクセルではなく、21ピクセルとなっています。
よく見ると、文字幅が2以上では8ピクセルずつ増加しています。(文字幅5以上も同様)

どうしてか?
セルの左右に余白があるためです。

わかりやすいように画像で説明します。
下の例は、HG丸ゴシックM-PRO、フォントサイズ11、太字なしです。(文字幅1が18ピクセル、文字幅2が29ピクセル、以降11ピクセルずつ増加)

↓青い部分が余白、7ピクセル↓
文字幅詳細

さらに厄介なことに、この余白、例のごとくフォントの種類によって異なります。
前回、Windowsで基本的なフォントの文字幅をまとめた表の(C)に該当するのがそれです。

フォントサイズ11の文字幅を比較

どうしてこの幅になるのかはわかりません。
少なくとも確かなのは、セルの横幅を設定するのは想像以上にめんどくさいということです。

        2009-10-12       セルの幅の単位は3種類

【likeP使い方】を中断して、セルの幅について考えてみます。

likePでは、セルを等幅なマス目にすることで座標を計算しています。

縦の幅は Cells.RowHeight = [ポイント] で、すべての行の高さを指定したポイントに設定できます。
横の幅は Cells.ColumnWidth = [文字幅] で、すべての列の幅を指定した文字幅に設定できます。

ご覧の通り、行と列とでは指定する単位が異なります。
ポイントは、ピクセルと1対1で対応しており、1ピクセル=0.75ポイントの計算式が成立します。(PCの解像度を変更している場合を除く)

問題は文字幅です。

文字幅とは、フォントの幅のことです。
Windowsで一般的なMS ゴシックでは、全角文字は半角文字の2倍の幅があり、これを等幅フォントと呼びます。
MS Pゴシックでは、文字によって幅が異なり(同じ半角文字でも、wはiより幅広ですね)、プロポーショナルフォントと呼びます。
どうでもいい話ですが、このブログの左カラムは文字がいっぱい入るようにプロポーショナルフォントを、右カラムはマクロのコードが見やすいように等幅フォントを使用しています。

↓プロポーショナルの中には、日本語だけ等幅のものとかもあります↓
フォントの種類

セルの横の幅の単位は、各フォントが持っている基準の幅を使用しているのです。
基準の幅とは、数値の0(半角の0)の幅のことです。

これは非常に不便です。
なぜなら、フォントの種類によって単位が統一されないからです。
わかりやすいように具体例をあげてみましょう。

↓1文字分のピクセル数↓
文字幅

基準の幅となる数値の0(半角の0)を比較しました。
MS ゴシックに比べて、メイリオは幅広なフォントだとういのが見てとれます。
※文字の高さも違いますが、ここでは触れません
また、同じMS ゴシックでも、フォントサイズによって文字幅は変わります。

参考として、Windowsで基本的なフォントの文字幅をまとめました。

フォントサイズ11の文字幅を比較

HG丸ゴシックM-PROが抜きんでて幅広なフォントだということがわかります。
それはさておき、実は上の一覧から「幅:1.00のピクセル数を2倍しても幅:2.00のピクセル数にはならない」という新しい問題が発見されました。

1文字の幅+1文字の幅=2文字の幅が成立しない! 次回はこれを検証します。

 | HOME | 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。