Office

提供:senooken JP Wiki
2025年9月8日 (月) 14:29時点におけるSenooken (トーク | 投稿記録)による版 (置換モード)

Font

いくつか愛用しているフォントがある。

日本語と英語でフォントを分けられないソフトがあったりするので、必然的に日本語フォントが優先される。

  • 明朝体: IPAexMinch
  • ゴシック: Migu 1C
  • 等幅: Migu 1M
  • スライド: Migu 1C

以前はスライド用にMigMix 1P/Migu 1Pを使っていた。視認性が高いから。その後、2011-04-18にMigu 1Cとさらに視認性を重視したフォントが生まれた (変更履歴 : M+とIPAの合成フォント)。Migu 1Cでいい。

Power Query

Power Query(パワークエリ)とは?Excelの限界を超える画期的なデータ処理を実現!

[データ]-[データの取得と変換]

データソースの変更

ファイルを変更して、一度読み込んだデータを別のデータに変更する。

  1. [データ]-[クエリと接続]-サイドバーからクエリをダブルクリック
  2. [Power Query エディター]-[クエリの設定]-[ソース]

なお、そのままやると列数が増えた場合に対応できない。

[ソース] で数式を [Columns=null] に変更するとOK。

Spreadsheet

文字数ソート

エクセル 文字数 多い順 並び替え -エクセルの列の並び替えなのです- Excel(エクセル) | 教えて!goo

=IF(A2="","",LEN(A2))

そのままではできないので、作業用シートを作る。

Cell

重複判定

Excelで重複したデータを簡単に確認する方法[COUNTIF関数] | パソコン工房 NEXMAG

別シートなどでCOUNTIF。これで重複があれば2以上になる。最後フィルターして、該当セル番地などが分かる。

空判定

ISBLANK 関数を使用すると、結果は false になります - Microsoft 365 Apps | Microsoft Learn

Excelの話。

ISBLANKは空文字の場合、FALSEになる。

セルの空白判定に役立つ関数がいくつかある。

  • ISBLANK=空白の場合。
  • ISERR=N/A以外のエラーの場合。
  • ISERROR=エラーの場合。
  • ISNA=N/Aの場合。
  • ISNONTEXT=空白セルと、文字以外のセル。

空文字の場合、ISBLANK=FALSE、ISERR/ISERROR/ISNONTEXT=TRUEになる。

これを利用して、(ISBLANK || ISERR)にすると、空白を判定できると思われる。

文字列

表計算ソフトで、文字列リテラルは、二重引用符で囲む。一重引用符はNG。文字列として二重引用符を使う場合、二重引用符内で、二重にする。

デフォルト値

IF関数でやるしかない。条件演算子、Null合体演算子、OR/||などは使えない。

IFERRORに近い機能がある。

先頭の一重引用符

Excelでは先頭の一重引用符 (アポストロフィー) はセルが文字列であることを示す特殊なマーク扱い。

先頭の一重引用符を残したい場合、工夫が必要。

  1. 一重引用符を二重にする ('text')。
  2. 先頭を=で始める (="'text'")。

=で始めると末尾の"の削除も必要になる。一重引用符の二重がシンプル。

検索特殊文字

vlookupなど検索系関数のキーの文字列では、特殊な文字がある。そのまま使うと、解釈されてマッチしない。

具体的には、~があるとうまく検索できない。

LibreOffice Calcだとデフォルトで正規表現が使えるので|もみなされてしまう。設定を変えるか、他の文字にするとよい。

固有値の抽出

https://www.ablebits.com/office-addins-blog/2016/04/21/get-list-unique-values-excel/

https://ask.libreoffice.org/en/question/101374/find-distinct-values-in-a-column-formula-for-calc/

https://office-hack.com/excel/duplicate-delete/

https://www.pc-koubou.jp/magazine/34116

年月ごとの集計

関数で月ごと・年月ごと・年ごとに値を抽出し合計・集計する - 病院SEにゃんとのPCトラブル解決&Excel関数等活用術

SUMIFSかSUMPRODUCTで実現可能。SUMPRODUCTだと参照用セルが不要。

=SUMPRODUCT((YEAR(集計日付列範囲)=YEAR(対象日付))*(MONTH(集計日付列範囲)=MONTH(対象日付)),集計対象列範囲)

売上集計などで重宝する。

包含判定

あるセルの内容が、リストに含まれているかを判定したいことがある。

Excelだとfind関数でできる。LibreOffice Calcだとfind関数は文字列内の検索になっていて意味が違う。

match関数か、countifを使うとどちらでも対応できる。countifが直感的。matchは位置の添字も欲しい場合。

Excel

Other

変更履歴

https://chatgpt.com/share/68661e71-5470-800b-85fe-38bcad8be136

Excelは変更履歴あまりできない。昔のxlsだとあったが、xlsxでなくなった。基本はWordで変更履歴は取り扱える。

Excelでやる場合、コメントになる。次のコメント・前のコメントがあるので、これで変更箇所の情報を残せる。

オートシェイプの全選択

Ref: シート上の図形(オートシェイプ)を全て選択した状態にするショートカットキー【エクセルTips】

[C-g]-[セル選択]-[オブジェクト]

ファイルのインポート

複数のCSVをシートごとにインポートして、整理したいことがある。単にCSVを開くだけだとやりにくい。

[データ]-[テキストまたは CSV から]-CSVファイルを選択-[インポート]-[データの変換]

CSVに改行が入っていると、崩れる。インポート時に設定がある。

[適用したステップ]-[ソース] をダブルクリック-[改行]=[引用符で囲まれた改行を無視] を選択-[OK]-[閉じて読み込む]。

データの変換時に、列の型も指定できる。全部文字列にすると、エラーなく全部読込はできる。

R1C1参照形式

列の表示が数字になってしまったのを、元のアルファベットに戻したい。|中小企業ソリューション|キヤノン

列を番号で表示して確認したいことがある。

[ファイル]-[オプション]-[数式]-[数式の処理]-[□R1C1参照形式を使用する]

これをオンにする。

Type

日付の数値対策

【Excel】入力した日付が5桁の数字になるのを防ぐ「書式設定」の確認方法 | 特選街web

Excelの日付が数字になるときの対処法 - [その他 + その他 ぺんたん info]

日付のデータが5桁の数字になって困ることがある。

これはセルの書式設定が、[標準] や [数値] になっているから。[日付] に変更すれば解決する。

セル参照、数式の場合は、TEXT関数で表示形式を指定する必要がある。"yyyy-mm-dd"を指定しておくとよいだろう。

文字の数値変換

文字列の数字を数値に変換する方法がいくつかある。

  • value
  • 1*

+はだめで、代わりに1*。これがシンプル。

数字がない場合、#VALUEのエラーになる。回避したければ、IFERRORで囲む。

=1*IFERROR(A1, 0)

文字列から数字の抽出

固定幅で決まっているならともかく、任意の位置の場合、シンプルな方法はない。

Excel: Extract number from text string

文字がない場合0。

=SUMPRODUCT(MID(0&A2, LARGE(INDEX(ISNUMBER(--MID(A2, ROW(INDIRECT("1:"&LEN(A2))), 1)) * ROW(INDIRECT("1:"&LEN(A2))), 0), ROW(INDIRECT("1:"&LEN(A2))))+1, 1) * 10^ROW(INDIRECT("1:"&LEN(A2)))/10)

文字がない場合空。

=IF(SUM(LEN(A2)-LEN(SUBSTITUTE(A2, {"0","1","2","3","4","5","6","7","8","9"}, "")))>0, SUMPRODUCT(MID(0&A2, LARGE(INDEX(ISNUMBER(--MID(A2,ROW(INDIRECT("$1:$"&LEN(A2))),1))* ROW(INDIRECT("$1:$"&LEN(A2))),0), ROW(INDIRECT("$1:$"&LEN(A2))))+1,1) * 10^ROW(INDIRECT("$1:$"&LEN(A2)))/10),"")

ただ、どちらの方法も1の単独数値はなぜか抽出できない。

google sheets - Extract numbers from excel cell with mixed text - Stack Overflow

=MID(A1, SEARCH("(", A1) + 1, SEARCH(")", A1) - SEARCH("(", A1) - 1)

前後の囲み文字が分かっているならば、SEARCHを駆使するのがいい。

文字列内の数字判定

Excel: Check if cell contains number in text string - Stack Overflow

=0<COUNT(FIND({0,1,2,3,4,5,6,7,8,9},A1))

Cell

シート名参照

【エクセル】シート名を関数で表示する方法。表の題名をシート名から自動で取得! | Excelの森

=MID(CELL("filename",A1),FIND("]",CELL("filename",A1))+1,31)

条件付き書式で行に色

条件付き書式を使って特定の文字が入っている行に色を付ける|クリエアナブキのちょこテク

  1. 塗りつぶしたい範囲を選択して [条件付き書式]-[新しいルール]。
  2. [数式を使用して、書式設定するセルを決定]
  3. 数式にセルの条件を記入する (例: =$A15="-")。
  4. [書式] で塗りつぶす色を選択。

非表示・フィルター条件確認

https://chatgpt.com/share/687851b9-8118-800b-818c-c1b60768bcfb

セルにフィルターがかかっているが、その条件がわからないことがある。

確認方法がいくつかある。

  1. フィルターのヘッダー部分が漏斗マークになっていれば、それがフィルター条件。
  2. 非表示の列があって、そこでフィルターになっていることがある。
  3. 1-2がないなら、手動非表示の可能性がある。

基本は1-2で条件を特定可能。

大量セルのオートフィル

Excelで大量行のオートフィルを一気にしたい。|カルフ / Ph.D / メーカー研究職

  1. まずベースとなる範囲を選択。
  2. [ホーム]-[検索と選択]-[ジャンプ] (C-g)。
  3. オートフィルの端のセル番地を指定して、Shiftを押下したままOK
  4. [ホーム-[フィル]-[連続データの作成]-[オートフィル]-[OK]

最大値位置の取得

【Excel】エクセルにて最大値や最小値のセルの場所(番号)を検索する方法【セル位置の取得】 | モアイライフ(more E life)

=MATCH(MAX($A$1:$A$11),A1:A11,0)

MATCHで (最大) 値のセルを検索する。

ゼロの非表示

空セルを参照したり、一部の計算結果が空白になる場合、0が表示されることがある。

いくつか方法がある。

[ツール]-[オプション]-[表示]-[ゼロ値のチェックを外す]

=IF(Sheet1!A1="","",Sheet1!A1)

置換

文字列を置き換えるREPLACE関数とSUBSTITUTE関数 | ノンプログラミングWebアプリ作成ツール - Forguncy(フォーガンシー)| メシウス株式会社

  • REPLACE: 文字位置を指定した置換。
  • SUBSTITUTE: 文字の置換。

SUBSTITUTEは重宝する。

条件付書式で括弧をつけた時の空白セル

『条件付書式で括弧をつけた時の空白セル』(kibi) エクセル Excel [エクセルの学校]

空白ってのは セルデータなし なのか 数式の結果が ="" なのか?


どっちでしょ?


後者なら #;#;;(@)


前者なら書式標準で数式結果でカッコ対応。


ちなみに、条件付き書式、関係ある?

セルの保護

Excelで特定のセルを変更できないようにする方法 | パソコン工房 NEXMAG

  1. 範囲選択-右クリック-[セルの書式設定]-[保護]-[☑ロック]
  2. [校閲](シートのタブ右クリック)-[シートの保護]-[☑シートとロックされたセルの内容を保護する]

これで指定範囲をロックできる。シート全体の保護機能を有効にする必要があるので注意する。

[シートの保護] は注意が必要。許可する権限が選べて、これを選ばないとロックしていないセルも変更不能になるので注意する。

データの入力規則

[EXCEL入力規則が設定されているセルを見つける方法|EXCEL屋(エクセルや)]

データの入力規則の設定されているセルは見た目ではわからない。

[ホーム]-[検索と選択]-[データの入力規則] で見つけられる。

数式

日時

【Excel】日付の加算と引き算をする【DATE、EDATE、EOMONTHを使う】

日時の入ったセルに対して、整数の加減算を行うと、1日単位の計算になる。これで日と週 (7) の計算はできる。

月の加減算はEDATE関数を使う。年は12か月として扱う。

EDATE(日付, 加減算月)

Word

キーワード変数

【Word】文書中に何度も登場する文字列を1か所変更するだけで他の箇所も一括で変更する方法 | My Life 8

例えば契約書などで、同じ氏名や住所が同一文書内に複数回登場することがある。一箇所変更すれば、全体も反映されるようにしたい。

ブックマークと相互参照を利用する。

  1. まずどこかで後で流用したい文字列を入力しておく (文書の先頭などわかりやすいだろう)。
  2. 登録対象文字列を選択して [挿入]-ブックマーク] を選び、わかりやすい名前でブックマークに登録する。
  3. 以後の登録した文字列を使いたい場所で、[挿入]-[相互参照] で先に登録したブックマークの参照を配置する。
  4. 文字列を一括置換したい場合、最初に登録したブックマークの文字列を別のものに変更する。

表内のタブ

【Word】表内でのタブ設定について | ヤマダパソコンスクール

枠組みなどで、表の中で基本文書を記述することがある。その際に、ルーラーによる揃えをしたくて、タブを入力したいが、次のセルに移動になってしまう。

C-TabでTabを入力できる。

LibreOffice Draw

テキストボックスの内部余白

text box internal margins - how to set them - English - Ask LibreOffice

テキストボックスに二重に余白がある。内部余白は、[Format]-[Text Attributes...] から変更可能。

グリッド

LibreOffice Drawの基本

図形の配置でグリッドとスナップが重要。

グリッドの間隔類は、[Preferences]-[LibreOffice Draw]-[Grid] で設定する。

[Resolution] がグリッド (点) の表示間隔。その横の [Subdivision] はグリッド同士の細分化個数。グリッドをあまり細かくしすぎると、目が疲れる。

例えば、グリッドを1間隔にして、subdivisionを2にすると、0.5間隔でグリッドの間をスナップできる。

LibreOffice Calc

e-taFormula

evaluate

セル内のテキストを数式として評価してほしい場面に遭遇した。

例えば、画素数 (720x720) の合計。Excelだとevaluateという関数があるが、Calcにはない。マクロなどで頑張る。あるいは、数式ではないがF9で数式に変換できるらしい。

PIM

Personal Information Manager - Wikipedia

PIMという個人情報管理用アプリの分類がある。

  • カレンダー
  • アドレス帳
  • 電子メール
  • タスク管理
  • メモ帳
  • 音声メモ
  • 電卓
  • 時計
  • 電子辞書

E-mail

General

docomoのメール

MozillaZine.jp フォーラム • トピック - 特定のメールだけ,画像が定位置に表示されません。

docomo関係のメールを受信すると画像などがうまく表示されず、ハイパーリンクも機能しない。

[View]-[Message Body As]-[Simple HTML] にすると、ハイパーリンクなどは機能する。

メールヘッダーの問題の模様。

- Content-Type: multipart/mixed; boundary="=_**********"
+ Content-Type: multipart/related; boundary="=_**********"

上記のように変更するとうまく表示されるらしい。


winmail.dat

winmail.dat変換ツール(インストール不要)

MS outlookなどで使われる添付ファイルの形式。

Naming
RFC
  • webmaster
  • support
  • info
  • service
  • pr
  • billing
  • 氏名

売上をアップするメールアドレス、商機を失うメールアドレス | マイナビニュース

infoやwebmasterなど企業サイトが備えるべきメールボックスのルール、ご存じですか? | 編集長ブログ―安田英久 | Web担当者Forum

rfc-jp.nic.ad.jp/rfc-jp/RFC2142-JP.txt

SuperTAINS News No.23 [Page.5]

【Mail】メールアドレス作成のガイドライン(RFC2142) – fumidzuki

公開用のメールアドレス。何にしようか考えていた。

RFC 2142でいくつか推奨されている。

info@ support@ answer@ inquery@ contact@ pubic@

contact@がやっぱり一番しっくりくる。info@ support@はRFC 2142にあるけど,これはビジネスより,サービスに紐付いたもの。個人でやる分にはサービス関係ないから,これは違う。publicも悪くはないのだけど,あまり一般的ではないか。

develop

GNU social JP管理人 (gnusocialjp@gnusocial.jp)'s status on Saturday, 08-Oct-2022 23:13:28 JSTGNU social JP管理人GNU social JP管理人
使用するメールアドレスに悩みます。GitのメールアドレスはGitのホスティングサービスに掲載され一般公開されます。

メーリングリストのメールアドレスも、返信方法によって引用されアーカイブで一般公開されます。

どう使い分けるのがよいでしょうか?案↓
GNU social JP管理人 (gnusocialjp@gnusocial.jp)'s status on Saturday, 08-Oct-2022 23:20:04 JSTGNU social JP管理人GNU social JP管理人
  1. develop@domainのようなアドレスで共有
  2. develop@, ml@ で用途別
  3. contact@ で一般公開用で共有
開発用のメールなので、1がいいですかね。仮に漏洩しても開発関係経由というのがわかるので。

1がいいと思う。

category

目的に応じて使い分けたほうがよさそう。

メールアドレスを何個ぐらい使い分けたら安全・快適に過ごせるのか - Dr.ウーパのコンピュータ備忘録

メールアドレス流出時の被害防止

不審なメールの検知

必要な数

  • 銀行・証券会社
  • 知り合い
  • ショッピングサイト

その他

  • Webサイトなどの公開用
  • 本名でのやり取り
  • ニックネーム
  • 金銭のやり取りのないサービス登録
  • 金銭のやり取りのあるサービス登録
  • 登録にメールアドレスが必要だけど,そんなに使っていないメール

メールアドレスの種類

  • フリーメール
  • プロバイダーメール
  • 独自ドメイン

メールアドレスの種類とアフィリエイトにおける3つの使い分け方法 | アフィリエイト

  • サービス登録用
  • メルマガ購読用(捨てアド)
  • メインアドレス

メールアドレスの使い分けかた(前編) - 学習する機械、学習しない人間

メールアドレスの使い分けかた(後編) - 学習する機械、学習しない人間

これらを考えてどういう名前で何個用意するかを考える。

とりあえずメインで使うmainというアドレスを一つ用意する。残りをどうするか。

Webサイト公開用にcontact

  • main: メインで使うメール。人に直接教えるときや,お金が絡む場合,ショッピングサイトなど実名が求められるような重要な内容にはこれ。こちらから送信するときもこれ。相手の顔が見えているとき。
  • contact:受信専用,公開用。問い合わせ用。なんかフォーラムやブログのコメント欄やcontact usなどにこちらから問い合わせる時なども。相手の顔が見えないときなど。
  • service: 基本的に受信専用,たまに返信。Webサービス登録用。
  • recruit:就職活動用。就職サイトとか転職エージェント,企業とやりとりするときはけっこうメール来るから。
  • job: 個人事業、仕事用、不動産は事業なのでこちら。
  • money: 金融機関登録用。銀行、証券会社、クレジットカード会社、決済会社・サービス。
  • shop/store: ショッピングサイト、個人間売買サイト。
  • ユーザー名: メールアドレスの@以前はユーザー名とみなされることがあるので、ユーザー名のアドレスも用意しておくとよさそうだ。


こちらから送信するときのメールアドレス。

Webサービスに登録するときどうするか。不動産屋さんとか人に教えるときはどうするか。アフィリエイトとかドメインとか実名が求められるときはどうするか。

gmailの+を考える。gmailでは+や.をつけると無限にアドレスをつけられる。ただし,受信は+のないメール。

ただし,gmailの+は使えないときがある。@以前の部分をユーザー名とみなして,+を無効な文字とみなすサービスがある模様。

ネットではがきが印刷~郵送できるポスコミ【1枚から注文OK】

https://www.tomtop.com/もだめ。

今まで使ってきたメールとはどうやりくりするか。

Thunderbirdでやる場合,Archiveするときに既読とメールのコピーを行う。

他のアドレスのメールはmainに転送するようにしておいて,mainのメールアドレスで確認。

最終的にThunderbirdでArchiveを実行したら,宛先のメールのフォルダーに同じ内容が既読状態でコピーされることにする。

このようなフィルターを作っておく。受信時にコピーしてしまうと,未読状態でコピーされてしまうか,受信した瞬間に既読状態になってしまい,見逃す可能性が高い。

Manage Identitiesで返信時に受信したアドレスで返信できるように登録しておく。

Mozilla Thunderbird

Other
Gmailの [すべてのメール] の重複

https://chatgpt.com/share/68917c4b-03f4-800b-9850-7ac5030d399e

いつからか、ThunderbirdのGmailで [すべてのメール] が2個表示されていて、ほぼ同じ内容が同期されている。

IMAPのラベルとフォルダーの関係。内部的にGmailは[Gmail]/All Mailで管理している。

Gmail側では [[Gmail]/&MFkweTBmMG4w4TD8MOs-] みたいな名前で同期されていた。

Thunderbirdの該当フォルダーの[General Information]-[Location]=imap://senoo.ken%40gmail.com@imap.gmail.com/%5BGmail%5D/%26MFkweTBmMG4w4TD8MOs-

重複の解消方法。

  1. サイドバーのgmailアカウントを右クリック ([File])-[Subscribe] で該当フォルダーのチェックを解除する。
  2. Gmailで[[Gmail]/&MFkweTBmMG4w4TD8MOs-]のラベル右端…-[ラベルを削除]

これで解消される。

プロファイルの統合

ImportExportToolsでデータ移行するというのが手堅い。一括操作を念頭に置いた機能になっている。数が少ないならば、emlファイルをドラッグドロップで取り込むこともできる。

迷惑メール対策
設定

https://chatgpt.com/share/68047848-7454-800b-9013-a891e572c0d1

迷惑メールに対して、[Junk] ボタンを押すと、学習して勝手に迷惑メールに振り分けてくれる。これを使うのがいい模様。

Thunderbirdでの迷惑メール対策法(Windows) – 神戸大学情報基盤センター

Thunderbirdの迷惑メール対策機能を使うには、設定が必要。

  • [Account Settings]-対象アカウント-[Junk Settings]
    • [Selection]-[☑️ Enable adaptive junk mail controls for this account]
    • [Desitination and Retention]-[☑️ Move new junk messages to]
      • ◉ "Junk" folder on:
      • ☑️ Automatically delete junk mail older than 14 days

他に全体設定がある。手動でJunkマーク設定時の設定。

  • 上記画面の [Global Junk Preferences] ([Settings]-[Privacy & Security]-[Junk])
    • ☑️ When I mark messages as junk:
      • ◉ Move them to the account's "Junk" folder
    • ☑️ Mark messages determined to be Junk as read

これで有効になる。

迷惑メール バイバイ!

標準の迷惑メール機能だと、すり抜けるものがある。それをカバーしてくれる模様。

Gmail

未読メール件数

Gmailの未読メール件数をタブに表示させる方法 | ライフハッカー・ジャパン

[設定]-[詳細/Advanced]-[未読メッセージ アイコン/Unread message icon]=[◎ 有効にする/Enabled]

Inboxのカテゴリーがあると、うまく機能しないことがある模様。無効にすると件数表示が正常に機能している模様。

デスクトップ通知

[設定]-[全般/General]-[Desktop notifications]-[◎ メール通知(新規メール) ON/New mail notifications on]

Inboxのカテゴリーの無効化

いつごろからか、Gmailは受信トレイがデフォルトでカテゴリーが有効になっていて、勝手にカテゴリーに振り分けられる。

Promotionとかに受信メールが振り分けられたりしていて、見落とす。

無効にする方法がある。

Gmail で受信トレイのカテゴリを追加または削除する - パソコン - Gmail ヘルプ

[Settings]-[See all settings]-[Inbox]-[Categories] のチェックをすべて外す。

Outlook

通知

Outlook on the web デスクトップ通知の設定と表示時間の変更 #Windows11 - Qiita

2か所で設定が必要。

まずOutlook web版の設定。

[設定]-[全般]-[通知] をオンにする。

続いて、Windowsパソコンの設定。

[設定]-[アクセシビリティ]-[視覚効果]-[この時間が経過したら通知を破棄する]

ここで表示時間を選ぶ。

VBA

Grammar

Variable

変数を宣言する (VBA) | Microsoft Learn

宣言

【VBA】変数を宣言しない場合の挙動(Variant型) | プログラミング勉強メモ

Office TANAKA - 今さら聞けないVBA[変数って宣言しなくちゃいけないの?]

Dim <VariableName> [As <DataType>]

変数宣言しないで変数を使うと、自動的にVariant型で宣言されたとみなされる。

Variant型はメモリーを多く使うので、型宣言したほうがいい。変数名間違いも検知してくれる。

なお、変数の宣言と代入を同時にはできない。分けるしかない。

Option Explicit

[ツール]-[オプション]-[編集]-[☑変数の宣言を強制する] を指定したほうがいい。

Type

データ型の概要 | Microsoft Learn

データ型 記憶領域サイズ 範囲
Boolean 2 バイト True または False
Byte 1 バイト 0 ~ 255
Collection 不明 不明
Currency (スケーリングされた整数) 8 バイト -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
Date 8 バイト -657,434 (100 年 1 月 1 日) から 2,958,465 件 (9999 年 12 月 31 日)
Decimal 14 バイト +/-79,228,162,514,264,337,593,543,950,335 (小数点なし)

+/-7.9228162514264337593543950335 (小数点以下 28 桁) +/-0.0000000000000000000000000001 (0 ではない最小の値)

Dictionary 不明 不明
Double (倍精度浮動小数点数) 8 バイト -1.79769313486231E308 から -4.94065645841247E-324 (負の値)

4.94065645841247E-324 から 1.79769313486232E308 (正の値)

Integer 2 バイト -32,768 〜 32,767
Long (Long 整数) 4 バイト -2,147, 483,648 〜 2,147, 483,647
LongLong (LongLong 整数) 8 バイト -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807

64 ビット プラットフォームでのみ有効。

LongPtr (32 ビット システムでは Long 整数、64 ビット システムでは LongLong 整数) 32 ビット システムでは 4 バイト

64 ビット システムでは 8 バイト

-2,147,483,648 から 2,147,483,647 (32 ビット システム)

-9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 (64 ビット システム)

Object 4 バイト 任意の Object 参照
Single (単精度浮動小数点数) 4 バイト -3.402823E38 から -1.401298E-45 (負の値)

1.401298E-45 から 3.402823E38 (正の値)

String (可変長) 10 バイト + 文字列の長さ 0 〜 約 20 億
文字列型 (String) (固定長) 文字列の長さ 1 〜 約 65,400
Variant (数値) 16 バイト 最大で Double の範囲までの任意の数値
バリアント型 (Variant) (文字) 22 バイト + 文字列長 (64 ビット システムでは 24 バイト) 可変長 文字列型 と同じ範囲
ユーザー定義 (Type を使用) 要素に必要な数 各要素の範囲は、そのデータ型の範囲と同じです。
String
About

文字列データ型 | Microsoft Learn

リテラル地は以下のいずれかで使用可能。

  • 二重引用符
  • Chr関数

一重引用符はコメントで使えないので注意する。

空判定

VBAで空白セルを判定する方法 | Excel作業をVBAで効率化

Range.Value = ""
Range.Text = ""

上記が無難。他にIsEmpty関数があるが、空文字はtrue扱いになる。

配列

配列と通常変数の違いは、宣言時にサイズの指定が必要な点。Option Base 1で明示的に指定しない限り、0が添え字の始まり。

Dim MyArray(10, 10) As Integer 
Dim sngArray() As Single
一括代入

Array 関数 (Visual Basic for Applications) | Microsoft Learn

【VBAの配列】値の一括代入と高速処理 | オフィスのQ&A

Variantを返すArray関数を使うしかない。

Dim str() As Variant
str = Array("りんご", "みかん", "すいか")
結合・追加
Sub test1()
    Dim names1 As Variant
    Dim names2 As Variant
    Dim names3 As Variant
    
    names1 = Array("太郎", "次郎", "三郎")
    names2 = Array("四郎", "五郎", "六郎")
    
    '配列の内容を全て文字列として結合した後、分割して一つの配列にする。
    names3 = Split(Join(names1, vbCrLf) & vbCrLf & Join(names2, vbCrLf), vbCrLf)
    
    '中身の確認
    Dim name As Variant
    
    For Each name In names3
        Debug.Print name
    Next name
End Sub
Private Function ArrayMerge(array1 As Variant, array2 As Variant)
    Dim separator As String
    separator = "&"
    ArrayMerge = Split(Join(array1, separator) & separator & Join(array2, separator), separator)
End Function

簡単にはできない。Joinでいったん文字列結合して、結合文字でSplitする。要素に結合文字が含まれているとだめなので、結合文字に注意する。

Set

オブジェクト変数 (オブジェクトへの参照を含む変数) の代入・割当時は、Set文が必要。ポインターみたいな扱いだからだろう。mallocみたいな扱いなんだと思う。

オブジェクト式またはNothingを割り当てられる。

Set MyObject = YourObject ' Assign object reference. 
Set MyObject = Nothing ' Discontinue association.

Newキーワードを使って、宣言と代入を同時にできる。

Set MyObject = New Object ' Create and Assign

関数が実行されている現在のインスタンス参照はMeでできる。this相当。

Statement

If...Then...Else

If...Then...Else ステートメントを使用する (VBA) | Microsoft Learn

1行の場合、End Ifを省略可能。

If myDate < Now Then myDate = Now 
Function Bonus(performance, salary) 
    If performance = 1 Then 
        Bonus = salary * 0.1 
    ElseIf performance = 2 Then 
        Bonus = salary * 0.09 
    ElseIf performance = 3 Then 
        Bonus = salary * 0.07 
    Else 
        Bonus = 0 
    End If 
End Function
Loop

反復。いくつか気泡がある。

  • Do...Loop
  • For Each...Next
  • For...Next
Do...Loop

Do...Loop ステートメント (VBA) を使用する | Microsoft Learn

    Do While myNum > 10 
        myNum = myNum - 1 
        counter = counter + 1 
    Loop 
    Do 
        myNum = myNum - 1 
        counter = counter + 1 
    Loop While myNum > 10 
For Each...Next

For Each...Next ステートメントを使用する (VBA) | Microsoft Learn

Collectionと配列の要素を反復できる。非常に重要。

Sub Add10ToAllCellsInRange()
    Dim rng As Range
    For Each rng In Range("A1:A10")
        rng.Value = rng.Value + 10
    Next
End Sub
Sub SetArrayValue()
    Dim TestArray(10) As Integer, I As Variant 
    For Each I In TestArray 
        TestArray(I) = I 
    Next I 
End Sub
Continue

Continueはない。代わりにGotoでジャンプする。

Public Sub sample()
    Dim r As Long
      
    For r = 1 To 10
        '■セル値が空白の場合、ループをスキップし、次の行を処理させる(Goto Continue)
        If Cells(r, 1) = "" Then
            GoTo Continue
        End If
Continue:
    Next r
      
End Sub
Break

For文を途中で抜ける(ループを途中で終了させる)【break】【Exit】【ExcelVBA】 | VBA Create

ループの終了はExit。現在のループだけ終了できる。複数終了したい場合、複数必要。または、Gotoで一括ジャンプする。

関数

About

Sub プロシージャと Function プロシージャの呼び出し (VBA) | Microsoft Learn

Function ステートメント (VBA) | Microsoft Learn

【VBA】SubとFunctionの違い【戻り値の有無、参照が可能か、関数として使えるか】

フォームのボタンへの登録可否の都合で、SubとFunctionの2種類がある。

Functionは戻り値があって、ワークシート関数としても使える。Subは戻り値なし。ただし、参照が可能でフォームボタンに登録可能。

動的呼出

関数名の変数や文字列から関数を実行したい時がある。

CallByNameとApplilcation.Runの2種類の方法がある。

  • CallByName: メソッドの実行。
  • Application.Run: マクロの実行。

マクロにするか、メソッドにする必要がある。

Excel

Object

ListObjects

テーブル、構造化参照を取得できる。データ範囲を自動拡張してくれるので楽。

    Set lo = ws.ListObjects(ws.Name)
    For Each row In lo.Range.Rows()

テーブル名で取得する。

Cell

範囲有無判定

Range.Find メソッド (Excel) | Microsoft Learn

Range.Find関数を使うのがエレガント。

見つからなければ、Nothingを返すのでIs Nothingで判定すればいい。

        If ThisWorkbook.Sheets("マスタ").Range("D1:D8").Find(row.Cells(2).Value, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then GoTo NextRow

LookIn/LookAt/SearchOrder/MatchByteは保存されるので注意する。

Value/Text

セルの値の参照方法がいくつかある。

Range.Value

Range.Text

ファイル出力などする際は、Range.Textがいい。Valueだと例えば、日時データは00:00だと時刻部分が省略される。

Color

VBA セルに色を設定する (Interior.Color, ColorIndex)

  • 文字色: Range.Font.Color/Cells.Font.Color
  • 背景色: Interior.Color

色はRGB関数で指定する。

イベント

Worksheet.Changeイベント

セルの値の変更時に、処理が可能。

VBA画面で該当シート-[Worksheet]-[Change] を選ぶ。

Private Sub Worksheet_Change(ByVal Target As Range)
End Sub

Target: 変更された範囲が渡される。

Other

開発タブ

デフォルトではVBAの開発UIが非表示になっている。

[ファイル]-[オプション]-[リボンのユーザー設定] から [☑開発] を選ぶ。

置換モード

[実行]-[デザイン モード] が有効だと通常のIMEの挿入モード。無効だと、置換モード。混乱するので注意する。

セル範囲をループ

セル範囲の各セルをループで操作する | Microsoft Learn

現在日時

VBAで今日の日付と現在時刻を取得する(Date、Time、Now) | Excel作業をVBAで効率化

Date()/Time()/Now()関数でDateオブジェクトを取得できる。これをFormat関数で書式化して使う。

Format(Now(), "yyyy年mm月dd日 hh時mm分ss秒")

Debug.Print

VBAでのデバッグはDebug.Printの出力をイミディエイトウィンドウに表示させて確認するのが基本。

【ExcelVBA入門】最初に覚えると幸せになれるDebug.Printの使い方! | 侍エンジニアブログ

オブジェクト変数またはWithブロック変数が設定されていません。

VBA エラー 91「オブジェクト変数またはWithブロック変数が設定されていません。」の原因と対処方法 - エク短|Extan.jp

Sub エラーテスト1R()
    Dim objRG As Range
    Set objRG = Range("A1:B10")
End Sub

インスタンス変数代入時はSetが必要とか。