わーぷろおじさん

WordやOffice関連の小細工の備忘録。

【word】表幅・列幅・行高の詳細(罫線幅・余白との関係)

表幅・列幅の構成要素

  • 列幅:隣接する罫線の中央から中央の距離
  • 表幅:列幅の合計。レイアウト上は、左右の外側罫線の幅の1/2も上乗せとなる。
    (例)
    100ptの列が2列ある表で、罫線が全て6ptの場合
    表幅:200pt(100pt+100pt)
    レイアウト上の表幅:206pt(左罫線6pt/2+表幅200pt+右罫線6pt/2)
  • 余白:罫線の中央からセル内段落までの距離。余白が罫線幅の1/2未満の場合は、罫線幅の1/2が余白として適用される(罫線端と段落に隙間なしの状態となる)
  • 罫線幅:左右の外側罫線はレイアウト上の表幅に影響するが、数値上の表幅・列幅には基本的には影響しない。

セル内ベタ組み

  • 列幅をフォントサイズの整数倍とする
  • 左右余白=フォントサイズとする

※余白>罫線幅/2に留意

ベタ組みの例

上記画像の設定

  • フォントサイズ:11pt

1行目

  • 列幅:各121pt
  • 余白:左右各5.5pt

2行目

  • 列幅:242pt
  • 余白:左右各5.5pt

ベタ組みについては下記参照

word-ozisan.hatenablog.com

ウィンドウ幅100%の表の表幅

段落幅から左右外側罫線の合計の1/2を差し引いた値が表幅となる(左右外側罫線の外側も段落幅に収まる)。

ウィンドウ幅100%の表でのベタ組み

段落幅をフォントサイズの整数倍+(左右罫線の合計)/2とする。

様式とかの作成

テーブル形式ではない表(行ごとに列構成・列幅が異なる表)を作成する場合で、pt単位またはmm単位で幅を調整する場合、仕上がりの表幅を切りの良い数値にしておくと、表の設計が楽になる。

(1)pt単位で作成

  • ページ幅:595.3pt(210mm)
  • ページ左右余白:各49.65pt(約17.5mm)
  • ページ段落幅:496pt
  • 罫線幅:1pt
  • 表幅:495pt(約174mm)

※495pt=11pt×45字

※「wordのオプション」で使用する単位をptとして作成しても、別の人がファイルを開きページ設定ダイアログを開いて「OK」した時に、pt単位がmm単位に変換され、丸め誤差を生じる。

(2)mm単位で作成

  • ページ幅:210mm
  • ページ左右余白:左19.9mm、右19.8mm
  • ページ段落幅:170.3mm
  • 罫線幅:1pt
  • 表幅:170mm

※左右余白を5mm、10mm減らせば、180mm、190mmの表も作成できる。

(3)その他

上記(1)、(2)は様式など長く使われる可能性が高いもので複雑な構成の表を正確に設計するための方法である。表の自動調整で事足りる場合は、下記記事にてテクニックを紹介している。

word-ozisan.hatenablog.com

行の高さ

  • 行の高さには、上下余白と罫線の幅は含まない。
  • 行の高さが「固定値」でない場合は、実際の行の高さは指定した値以上になる場合があることに留意。

【MSoffice一般】ボールドフォント(太字)をCtrl+Bしないで使う

概要

フォント名に直接ボールドフォント名を入力する。

(Word・ExcelPowerPoint共通)

主要な和文ボールドフォント(windows標準環境)

  • 游ゴシック Bold
  • メイリオ ボールド
  • BIZ UDPゴシック bold
  • UD デジタル 教科書体 NP-B

※ピッチ違いとUIフォントは省略。

※上記のうちUDデジタル教科書体はBボタン(Ctrl+B)でウェイトの切り替え非対応であり、疑似ボールドとなる。自分で導入したフォントもたぶんBボタン切り替え非対応なんじゃないかと思われる。

明朝体にBボタン対応フォントはないと思われる。

使いどころ(微妙)

Bボタンを使わないスタイル管理を徹底すれば、テーマのフォントを差し替えても、うっかり疑似ボールドを生み出すことがない。

【word】文字間隔の調整いろいろ(備忘録)

設定対象別

文字間隔の調整(文書単位)

Wordのオプション > 文字体裁

  • 間隔を詰めない
  • 句読点のみを詰める(デフォルト)
  • 句読点とかなを詰める

ページ設定の文字数(セクション単位)

ページ設定ダイアログ > 文字数と行数タブ

  • 標準の文字数を使う
  • 行数だけ指定する(デフォルト)
  • 文字数と行数を指定する
  • 原稿用紙の設定にする

※「文字数と行数を指定する」の場合は、任意の値で字送り幅を設定できる。

禁則処理(段落単位)

段落ダイアログ > 体裁タブ

  • デフォルト:有効
※レベル(対象文字)は文書単位

Wordのオプション > 文字体裁

  • 標準レベル(デフォルト)
  • 高レベル
  • ユーザー設定

句読点のぶら下げ(段落単位)

段落ダイアログ > 体裁タブ

  • デフォルト:無効

文字幅と間隔(段落単位)

段落ダイアログ > 体裁タブ

  • 行頭の記号を1/2の幅にする(デフォルト:無効)
  • 日本語と英字の間隔を自動調整する(デフォルト:有効)
  • 日本語と数字の間隔を自動調整する(デフォルト:有効)

カーニング(文字単位)

フォントダイアログ > 詳細設定タブ

  • カーニングを行う(デフォルト:有効、1pt以上の文字)
※カーニングの設定はフォントダイアログから行うが、対象文字種は文書単位

Wordのオプション > 文字体裁

  • 半角英字のみ
  • 半角英字と区切り文字(デフォルト)

フォントの文字間隔(文字単位)

フォントダイアログ > 詳細設定タブ

  • 文字間隔(デフォルト:標準)

※ページ設定の文字数で設定される字送り幅に上乗せで間隔を設定するもの。

設定画面別

Wordのオプション > 文字体裁(文書単位)

  • 禁則文字レベル
  • カーニング対象文字
  • 文字間隔の調整

ページ設定ダイアログ > 文字数と行数タブ(セクション単位)

  • 文字数
  • 字送り

段落ダイアログ > 体裁タブ(段落単位)

  • 禁則処理を行う
  • 句読点のぶら下げを行う
  • 行頭の記号を1/2の幅にする
  • 日本語と英字の間隔を自動調整する
  • 日本語と数字の間隔を自動調整する

フォントダイアログ > 詳細設定タブ(文字単位)

  • 文字間隔
  • カーニングを行う

【word】表のセルがページを跨ぐ時に、ページ末・次ページ頭の罫線を非表示にする

概要

内容を記載するセルを空白セルでサンドイッチする。

方法1(行サンドイッチ法)


上空白セル

セル内の段落書式

  • 行送り:1pt
  • グリッドに合わせる:無効
  • 次の段落と分離しない:有効

セルの書式

  • 上罫線:あり
  • 下罫線:なし

内容を記載するセル

セルの書式

  • 上下罫線:なし

下空白セル

セル内の段落書式

  • 行送り:1pt
  • グリッドに合わせる:無効

セルの書式

  • 上罫線:なし
  • 下罫線:あり

方法2(表サンドイッチ法)

表スタイルを用いる方法

表スタイルの設定
表全体
  • 垂直罫線:3本(左・中・右)
  • 水平罫線:1本(中)
タイトル行
  • 上と左右罫線:なし
  • 下罫線:任意(下記、優先順位を参照)
集計行
  • 下と左右罫線:なし
  • 上罫線:任意(下記、優先順位を参照)

※タイトル・集計行の上下罫線と、表全体の中罫線を同じ線種にする場合は、タイトル・集計行の上下罫線は「なし」でも同じ結果が得られる。

【タイトル行・集計行の罫線と表全体の罫線の優先順位】

タイトル・集計行の上下罫線が細線(デフォルト実線)の場合、優先順位は下記のとおりとなる(一部のみ記載)

○表全体罫線の優先順位が下となるもの
  • 細線(タイトル・集計行より線が細い場合)

  • 点線

  • 破線(間隔大)

×表全体罫線の優先順位が上となるもの
  • 細線(タイトル・集計行より線が太い場合)

  • 破線(間隔小)

  • 一点鎖線・二点鎖線

  • 二重線・三重線

セル内の段落書式
  • 行サンドイッチ法に同じ。
適用方法
  • 表に表スタイルを適用し、集計行を有効にする。

発展1(見出し行下罫線なし、水平中罫線なし)

※「見出し行」とは言ったものの、見出しとして使う必要はない。

(1)行サンドイッチ法

上から1行目と下から1行目を空白セルとする

  • 上から1行目の下罫線:なし
  • 下から1行目の上罫線:なし
  • その他の行の水平罫線(3本とも):なし

※行サンドイッチ法とはしているが複数行をまとめてサンドイッチする

(2)表サンドイッチ法(表スタイル)

  • タイトル行の下罫線:あり
  • 集計行の上罫線:あり
  • 表全体の水平罫線(3本とも):なし

発展2(見出し行下罫線あり、水平中罫線なし)

(1)行サンドイッチ法

上から2行目と最終行を空白セルとする。

  • 1行目(見出し行)の上下罫線:あり
  • 2行目(見出し行の下)の下罫線:なし
  • 最終行の上罫線:なし
  • その他の行の水平罫線(3本とも):なし

(2)表サンドイッチ法(表スタイル)

※表スタイルの設定は、上述の発展1(2)と同じ。

  • タイトル行の下罫線:あり
  • 集計行の上罫線:あり
  • 表全体の水平罫線(3本とも):なし
【裏技的手順】

  • 2行目(見出し行)の下に行を追加
  • 2行目(見出し行)の下罫線、または3行目(追加した行)の上罫線あり
  • 3行目(追加した行)を削除

⇒2行目(見出し行)の下罫線は生きるが、ページ跨ぎには反映されなくなる。

※「各ページにタイトル行を表示する」には対応できないと思われる(そもそもこんなことする時に、各ページタイトル行表示は不要なのですが一応)

留意事項

  • セル書式、段落書式の改ページ設定によっては、セルがまるごと次ページに送られるので適宜設定する。
  • 下空白セルがページの先頭に来てしまう場合は、思った結果が得られない。「前の段落と分離しない」という設定はないので、祈るしかない。
  • 行ごとに罫線の種類を変えたい場合は、行サンドイッチ法で泥臭く設定していく。

【word】段落罫線の調整(余白設定・行取り)

概要

段落罫線・網掛けの設定について、水平方向の調整方法と、垂直方向の調整方法(行取り)を説明する。

(※タイトル画像は、罫線の存在を示すため、上下右罫線を薄い灰色としているが、ページの色と同色とすれば、見えなくなるもの)

共通設定(例)

ページ設定

  • 行送り:22pt(任意の値)

本文設定

  • 間隔:1行
  • 文字を行グリッドに合わせる:有効

罫線で囲う段落

  • 間隔:22pt(ページ設定に合わせる)
  • 文字を行グリッドに合わせる:有効
  • 次の段落と分離しない:有効
  • 段落を分割しない:有効

※罫線囲い部分については下記で紹介する方法で設定を追加していく。

1 横方向の調整

(1)罫線の左右の位置を本文領域の幅に合わせる。

罫線の太さと余白は本文領域からはみ出て配置されるので、その分を段落インデントでオフセットする。

段落インデントの値はpt単位で設定する。

インデント幅(pt) = 段落罫線の太さ + 罫線のオプションの横の余白

※左右で罫線の太さ、余白の大きさが異なる場合は、それぞれ計算。

(設定例)
段落罫線の太さ:左側6pt、右側6pt
罫線オプションの余白:左4pt、右4pt
インデント幅:左10pt、右4pt

※右側インデントは、右側罫線を表示したい場合は、罫線の太さを含むインデント幅とする。この例では、右側インデントを非表示とする場合の設定。

(2)段落罫線内でぶら下げ・字下げを行う

(1)でインデントをpt単位で行っているので、字下げ・ぶら下げ幅もpt単位で行わなければならない。

(設定例)
フォントサイズ14ptなので、ぶら下げ幅を14ptに設定する。

※フォントサイズを変更するたびに、ぶら下げ幅も手動で追従する必要あり。

2 縦方向の調整

段組みを行う場合で、左右の段の高さを揃える場合は、正確な調整が必要。ここでは左右の段の高さを揃えるための設定を説明する。

段落罫線の上下の罫線の太さと余白を行送りの値(ここでは22pt)に合わせる。

ページ設定の行送り = 段落罫線の太さ(上下計) + 罫線のオプションの余白(上下計)

(設定例)
ページ設定の行送り:22pt
上下の罫線の合計:12pt (6pt*2)
上下の余白の合計:10pt (5pt*2)

留意点

  • 網掛オプションで余白を設定する場合は、余白設定方向の罫線設定が必要。デザイン的に罫線が不要な場合は、ページの色と同色とする。
  • 左だけ罫線が必要な場合、右にも罫線を設定しないと網掛けに空白ができてしまうので、左右両方の罫線の設定が必要。
  • 段区切りの次の行では、段落罫線の挙動が怪しくなるので、改行で調整したほうが無難(タイトル画像では段区切りは入れていない)
  • 段落書式の段落前後の間隔は罫線より外側に働く。CSSに置き換えれば、段落書式の前後の間隔はmargin、罫線の太さはborder、罫線オプションの余白はpaddingとなる。
  • ページ・段の先頭の行では段落書式の段落前の間隔が適用されず、行がずれやすいので、段落前の間隔(margin-top)で行取りの調整を行わない方が無難。段落と本文の間を調整したい場合は、段落前の間隔は整数倍のみとする。上下の罫線・余白を細くとって、段落後の間隔で行送りの高さに揃えることは可。
  • 上下に6ptの無色罫線を取っておけば、本文との距離の窮屈さは回避できる(と思われる)
  • 罫線のレイヤーは上下が上位で、左右が下位。
  • 行の高さの統一が不要な場合は、もっと自由に設定してよい。

【excel vba】Listobjectをテーブル名で掴み、SQLを投げる

概要

Listobjectの取得にはworksheetの指定から行わなければならず面倒なので、テーブル名だけで取得できるように関数を用意する。

テーブルに対してSQLを投げる際のSQL文をListobjectを起点として作成する方法を説明する。

コード

New_モジュール

Public Function Listobject(LstName_ As String) As Listobject
    Dim L As Listobject
    Dim S As Worksheet
    For Each S In ThisWorkbook.Worksheets
        For Each L In S.ListObjects
            If L.Name = LstName_ Then
                Set Listobject = L
                Exit Function
            End If
        Next
    Next
    MsgBox "リストオブジェクト" & LstName_ & "は存在しません"
End Function

※当方推奨のNew_モジュールについては下記記事参照。

word-ozisan.hatenablog.com

実行(標準モジュール)

Public Sub test()
'リストオブジェクトの取得
    Dim Lst As Listobject
    Set Lst = New_.Listobject("hoge")

'SQL文の作成
    Dim Tbl As String
  Tbl = "[" & Lst.Parent.Name & "$" & Lst.Range.Address(False, False) & "] "
    
    Dim s As String
    s = "SELECT * FROM @Tbl "
    s = Replace(s, "@Tbl", Tbl)
    Debug.Print s
End Sub

補足

SQL文の作成は関数を用意してもよいと思われる。もしくはListobjectをラッパークラスで包んでもいいかも。

発展

置換を入れ子にすれば、サブクエリ的な記述もごちゃごちゃせずに書ける。

【vba】自作コレクションクラスの備忘録

概要

自作コレクションクラスにインスタンスをNewから直Addして、For Each又はIndexでアクセスする備忘録

前提

クラスの属性については、他のサイトで十分に解説されています。

コンストラクタに引数を持たせる方法については、自前の下記記事を参照願います。

word-ozisan.hatenablog.com

コード

Personクラス

Option Explicit
Private mName As String

Public Function Init(Name_ As String) As Person
    mName = Name_
    Set Init = Me
End Function

Public Property Get Name() As String
    Name = mName
End Property

Personsクラス

Option Explicit
Private mItems As Collection

Private Sub Class_Initialize()
    Set mItems = New Collection
End Sub

Public Property Get Item(Index_ As Long) As Person
'Attribute Item.VB_UserMemId = 0
    Set Item = mItems(Index_)
End Property

Public Property Get NewEnum() As stdole.IUnknown
'Attribute NewEnum.VB_UserMemId = -4
    Set NewEnum = mItems.[_NewEnum]
End Property

Public Sub Add(Item_ As Person)
   mItems.Add Item_
End Sub

Public Function Count() As Long
   Count = mItems.Count
End Function

コメントアウトしている部分はclsファイルに記述している内容

New_モジュール(標準モジュール)

Option Explicit
Public Property Get Person(Name_ As String) As Person
   Dim x___ As New Person
   Set Person = x___.Init(Name_)
End Property

実行(標準モジュール)

Public Sub test()
   Dim Persons As Persons
   Set Persons = New Persons
   
   Persons.Add New_.Person("Taro")
   Persons.Add New_.Person("Jiro")
   Persons.Add New_.Person("Sabu")
   
   Dim p As Person
   For Each p In Persons
        Debug.Print p.Name
    Next

  Dim i As Long
For i = 1 To Persons.Count
Debug.Print Persons(i).Name
Next
End Sub

//(出力)
//Taro
//Jiro
//Sabu
//Taro
//Jiro
//Sabu

使用感

コレクションにNewして直接Addできるのが気持ちいい。

取り出しも楽だね。