サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
買ってよかったもの
officetanaka.net
UserFormで入力(または選択)された情報を、別のUserFormに反映させる方法です。これには、2つのやり方があります。なお、ここでは、UserForm1のTextBoxに入力された文字列を、UserForm2のLabelに表示するという動作を例にします。 【UserForm1】 【UserForm2】 直接別のコントロールに設定する 難しく考えることはありません。UserForm1のコードから、UserForm2のコントロールを直接操作してやればいいんです。 【UserForm1】のコード Private Sub CommandButton1_Click() ''[UserForm2を開く]ボタン UserForm2.Label1.Caption = Me.TextBox1.Text UserForm2.Show End Sub 【UserForm2】のコード Private Su
VBAの関数 Home Excel VBA VBAの関数一覧 Abs Array Asc AscB AscW Atn CallByName CBool CByte CCur CDate CDbl CDec Choose Chr、ChrB、ChrW CInt CLng Cos CreateObject CSng CStr CurDir CVar CVDate CVErr Date DateAdd DateDiff DatePart DateSerial DateValue Day DDB Dir DoEvents EnViron EOF Error Exp FileAttr FileDateTime FileLen Filter Fix Format FormatCurrency FormatDateTime FormatNumber FormatPercent FreeFile FV
いや、別にいいですよ、宣言しなくても。もし、あなたが、辛いことや苦しいことが大好きでたまらないドMな性格だったり、とにかく自分に厳しく、苦行や荒行に目がない修行僧のような生き方を好むのなら、どうぞ変数の宣言をしないでマクロを作成してください。ただし、その苦しさは少しも気持ちよくありませんし、その修行はあなたの肉体や精神を何も鍛えてはくれませんけどね。百聞は一見にしかずです。変数を宣言しないとどうなるか、実例をお見せしましょう。 上図のようなデータを用意してください。A列に2種類のデータが入っています。「東京都××区」と「○○市××区」です。ここでは、仮に6件としました。ここから「××区」部分を抜き出してB列に入力します。ついでに「○○市」が何件あったかをカウントして、最後に表示します。変数の宣言を強制しないモジュールで、下記のマクロを実行してみてください。もし、モジュールの先頭に Opti
マクロ記録をすると、たとえば次のようなコードが記録されます。 With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 255 .TintAndShade = 0 .PatternTintAndShade = 0 End With マクロの内容はともかく、今回はこの「With」の話です。Withって、いったい何でしょう? 主語を省略する書き方 Withはステートメントの一種です。マクロ記録で記録されるステートメントは、唯一このWithだけです。Withの働きは、われわれの日常会話を考えれば容易に理解できます。 たとえば、私の友人に「鈴木さん」という人がいたとします。私があなたに、この鈴木さんのことを紹介するとき、次のような言い方はしませんよね。 鈴木さんの出身は横浜で 鈴木さんの
FileSystemObjectオブジェクトは、ドライブ・フォルダ・ファイルなどを操作できるオブジェクトです。FileSystemObjectオブジェクトは、Scrrun.dllファイル内のスクリプティングタイプライブラリとして提供されます。 VBAからFileSystemObjectオブジェクトを利用するには、CreateObjectメソッドを実行してFileSystemObjectオブジェクトのインスタンスを作成し、そのインスタンスに対してプロパティの設定やメソッドを実行します。ここでは、FileSystemObjectオブジェクトのプロパティやメソッドのリファレンスと、使い方のサンプルを解説します。 なお、本文の内容はExcel VBAでの操作を前提に書きますが、AccessなどのVBAや、VisualBasic(VB)からも同じ考え方でFileSystemObjectオブジェクトを
Sub Sample1() Range("A1").AutoFit End Sub いろいろなケースで発生するエラーです。 上のコードは、セルA1に対して"列幅の自動調整(AutoFitメソッド)"を実行しようとしたためエラーになりました。AutoFitメソッドは、行単位または列単位に対して実行しないといけないからです。正しくは、次のようにします。 Sub Sample1() Range("A1").Columns.AutoFit End Sub または Sub Sample1() Range("A1").EntireColumn.AutoFit End Sub みたいに。 Excel 2007のVBAでは[ヘルプ]ボタンをクリックしても、解説ページが開きませんでした。 Excel 2003のVBAヘルプでは、次のように記載されています。 マクロ エラー 実行中のマクロにエラーが発生しまし
Sub Sample1() Dim i As Long For i = 1 To 4 Cells(i, 1) = Worksheets(i).Name Next i End Sub これは、よく起こるエラーです。 上のコード、ワークシートが3枚しかない状態で実行すると「インデックスが有効範囲にありません」と怒られます。 そりゃそうです。Worksheets(1)からWorksheets(3)までしかないのに、Worksheets(4)を調べようとしているのですから。30人の生徒がいるクラスで、出席番号31番の生徒を指しているようなものですね。"学校の怪談"じゃないんですから、それで返事される方が怖いです。 インデックスは、コレクションの数だけではありません。次のようなケースでも同じエラーが起こります。 Sub Sample2() Dim tmp As Variant, i As Long
大量のデータを絞り込むには、オートフィルタが便利です。ここでは、VBAからオートフィルタを使い倒すテクニックをご紹介します。なお、ボリュームがありますので、以下の項目にページを分けて解説します。なお、ここで解説するオートフィルタは、通常のワークシートに設定されているとします。テーブルでオートフィルタを操作するときは、また別の考え方が必要です。VBAでテーブルを扱う方法に関しては「VBAでテーブルの操作」をご覧ください。 書き方の基本 文字列で絞り込む 数値で絞り込む 日付で絞り込む 色で絞り込む 作業列で絞り込む 絞り込んだ結果をコピーする 絞り込んだ結果を集計する (←このページ) 絞り込んだ結果の行を操作する オートフィルタの状況を判定する 数式のエラーで絞り込む ワークシート関数を使う ここで解説する"集計"とは、主に"カウント"のことです。マクロでオートフィルタを活用するときは、絞
MsgBoxで、どんなときに括弧を使うのかと、メッセージを改行する"改行コード"について、詳しい解説を動画で公開しています。ぜひ、こちらもご覧ください。Youtubeでは、ほかにもたくさんの動画を公開しています。チャンネル登録をお忘れなく! Office TANAKAチャンネル ■VBAのコードで、括弧はどんなときに使うのか 構文 引数promptは必ず指定します、ダイアログボックスに表示するメッセージを指定します。 引数buttonは省略可能です。ダイアログボックスに表示する、ボタンの種類やタイプなどを指定します。 引数titleは省略可能です。ダイアログボックスのタイトルバーに表示する文字列を指定します。 引数helpfileは省略可能です。ダイアログボックスの[ヘルプ]ボタンから開くヘルプファイルを指定します。引数helpfileを指定する場合は、引数contextも必ず指定しなけれ
下図のような表があったとき、検索機能で"田中"を探してみます。 このとき、[すべて検索]ボタンをクリックすると、次のように、条件に一致したすべてのセルがリストアップされます。 このように、検索したいセルが複数存在したとき、それらをすべて検索するにはどうしたらいいでしょう。 まず、1つだけ検索する、一般的なやり方を試してみましょう。 Sub Sample1() Dim FoundCell As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Else FoundCell.Activate End If End Sub 検索の基本とも言えるコードです。特に難しくはありませんね。 さて、Findメソッドには引数Afterがあります。この引数Afterに、見つかった
フォルダを作成する方法はたくさんありますが、深い階層のフォルダを作成するとき、パスの中に存在しないフォルダがある場合は、そこから作成しなければなりません。たとえば「C:\Work\Sample\Test」というフォルダを作りたいとき、もし「C:\Work\Sample」フォルダが存在しない場合は、まず「C:\Work\Sample」フォルダを作り、次に「C:\Work\Sample\Test」フォルダを作らなければなりません。FileSystemObjectでこれをやるには、どこから存在するかを再帰的にチェックするなどの方法があります。その方法は「保存先のフォルダがなかったら作る」をご覧ください。 まぁ、これはこれで技術としてはおもしろいので何かに役立つでしょうけど、実はSHCreateDirectoryExというAPIを使うと、こうした存在しないパスのフォルダを一発で作成することができま
ブックを「共有ブック」として保存すると、複数のユーザーで同時に編集することができます。 あなたが共有ブックを開いたとき、ネットワーク内で他の誰かが同じブックを開いているかもしれません。 共有ブックを、現在誰が開いているかを調べるには、WorkbookオブジェクトのUserStatusプロパティを使います。 UserStatusプロパティは、そのブックを開いているユーザーに関する情報を、次のような二次元配列で返します。 UserStatus(n, 1) … ユーザー名 UserStatus(n, 2) … 開いた日時 UserStatus(n, 3) … 共有ブックかどうか もし、そのブックを、あなただけが開いているのなら、UserStatusプロパティが返す配列の要素は1(あなただけ)になります。配列の要素数を調べるにはUBound関数を使います。 Sub Sample1() Dim Us
大量のデータを絞り込むには、オートフィルタが便利です。ここでは、VBAからオートフィルタを使い倒すテクニックをご紹介します。なお、ボリュームがありますので、以下の項目にページを分けて解説します。なお、ここで解説するオートフィルタは、通常のワークシートに設定されているとします。テーブルでオートフィルタを操作するときは、また別の考え方が必要です。VBAでテーブルを扱う方法に関しては「VBAでテーブルの操作」をご覧ください。 書き方の基本 (←このページ) 文字列で絞り込む 数値で絞り込む 日付で絞り込む 色で絞り込む 作業列で絞り込む 絞り込んだ結果をコピーする 絞り込んだ結果を集計する 絞り込んだ結果の行を操作する オートフィルタの状況を判定する 数式のエラーで絞り込む まずは、オートフィルタを操作するマクロの基本的な書き方を解説します。 対象には1つのセルを指定する オートフィルタを操作す
Excel 2003まででお馴染みのColorIndexプロパティは、あらかじめ56色が登録されている色パレットから、何番目の色を使うかというプロパティです。たとえば、標準の色パレットでは、3番に赤が登録されていますので、ColorIndexプロパティに3を設定すると、そこは赤くなるという仕組みです。 対してColorプロパティは何を設定するプロパティでしょうか。ヘルプには次のように書かれています。 オブジェクトに応じて適用する色を設定します。色は、RGB関数によって作成された値です。 Colorプロパティには「色」を設定すると。その設定する「色」は、RGB関数によって作成すると。そういうことです。 では、RGB関数とは何でしょう。これもヘルプを見てみます。 色のRGB値を表す長整数型 (Long) の値を返します。 構文 RGB(red, green, blue) red:RGBのR(赤
構文 CallByName(object,procname,calltype,[args()]) 引数objectには、対象となるオブジェクトを指定します。 引数procnameには、メソッド名またはプロパティ名を指定します。 引数calltypeには、呼び出すプロシージャの種類を指定します。 引数args()は省略可能です。メソッドやプロパティに引き渡す引数を指定します。 解説 指定したオブジェクトのメソッドを実行したり、プロパティの値を設定したりします。 引数calltypeには次の定数を指定します。 定数 値 内容
変数は、宣言のしかたによって、使える場所が限られます。これを、変数の適用範囲といいます。変数の適用範囲を理解するには、VBAの"プロシージャ"と"モジュール"という概念を理解しなければなりません。 プロシージャとモジュール プロシージャとは、Sub ○○~End SubまたはFunction ○○~End Functionなど、マクロの最小実行単位です。 ''2つのSubプロシージャ「Sample1」「Sample2」と ''1つのFunctionプロシージャ「myCalc」がある Sub Sample1() ''何かの処理 End Sub Sub Sample2 ''何かの処理 End Sub Function myCalc(n As Long) ''何かの処理 End Function モジュールとは、こうしたプロシージャを記述する場所です。一般的には、標準モジュールにプロシージャを作
バリアント型変数は、どんなデータでも格納できる万能の型です。整数や文字列だけでなく、セル(Rangeオブジェクト)やワークシート(Worksheetオブジェクト)などのオブジェクトを格納することも可能です。もちろん、配列も格納できます。 Sub Sample39() Dim buf(3) As String, Member As Variant buf(1) = "tanaka" buf(2) = "suzuki" buf(3) = "yamada" Member = buf MsgBox Member(2) End Sub 上のコードは、バリアント型変数Memberに、配列変数のbufを代入しています。代入のあと、変数Memberは配列として操作できます。 配列をバリアント型変数に入れる バリアント型変数には、上記のように配列変数を代入することが可能ですが、一般的には「配列を返す関数」な
先日、某所の分科会でExcelのセミナーをやったとき、受講された方から「入力済みの全角文字や半角文字を後から統一するにはどうしたらいいですか?」というご質問をいただきました。話の流れから入力されている文字は「マンション」や「アパート」などのカタカナではないかと思います。その場では「関数を使うとできますよ」とお答えしましたが、具体的なやり方まではお話ししませんでしたので、ここで解説します。 下図のようなデータが入力されていたとします。 「スズキ」と「サトウ」は全角、「ヤマダ」と「ササキ」は半角のカタカナとして入力されています。全角のカタカナと英数字を半角に変換するにはASC関数を使います。 反対に、半角のカタカナと英数字を全角に変換するのがJIS関数です。 関数の結果をコピーするときの注意 関数で変換した結果を、元のセルにコピーするときには注意が必要です。 関数などの計算式が入力されている
ある表の中から、すべての「空白行」だけを一気に削除する方法をご紹介します。ここでは、オートフィルタを"使う方法"と、"使わない方法"の2つを解説します。どちらがいい、ではなく、両方思いつくようにしてください。 オートフィルタを使う方法 上図のような表があったとします。まずは、この表にオートフィルタを設定します。表全体を選択して、[データ]タブの[フィルター]ボタンをクリックするか、Ctrl + Shift + Lを押します。 どの列でもいいです。タイトルに表示されている"オートフィルタ矢印ボタン"(▼ボタン)をクリックします。表示されるリストから「(空白セル)」だけを選択して[OK]ボタンをクリックします。 実行すると「空白行」だけで絞り込まれます。絞り込まれて表示されている行全体を選択して右クリックし、表示されるメニューから[行の削除]をクリックします。 実行すると、選択した行全体が削除
たとえばA列に、下図のようなデータが入力されていたとします。 A列には全部で6個の数値が入力されていて、最終セルの「52」はセルA7です。このように数値が入力されている表の最終行にSUM関数を挿入してみましょう。つまり、次のような感じです。 セルに数式を挿入するだけなら簡単ですね。今回のケースなら Sub Sample1() Range("A8") = "=SUM(A2:A7)" End Sub でOKです。しかし、データが入力されている最終セル(ここではセルA7)がマクロを実行するたびに異なる場合はどうでしょう。 まず、SUM関数を挿入するセルを特定します。SUM関数を挿入するのは「最終セルの1つ下」のセルですね。データが入力されている最終セルは、Endモードで取得できます。 最終セル → Range("A2").End(xlDown) ここは、後の処理を楽にするため、あえてRange(
またまた、個人的な備忘録です。でも、この件、ずいぶん多くの人が困って検索などをしているようです。私もしました(笑)。でも、望む解決策は見つかりませんでした。なので一応書いておきましょう。 先日、ASUS の ZENBOOK UX31E を購入しました。なかなか快適に使用しているのですが、ひとつ困ったことがあります。ASUS Live Updateです。 まぁ、その名の通り、ASUS のソフトウェアなどで、重要または推奨するアップデートがあったとき、それを通知して自動的にインストールするためのアプリです。Windows や Office などにも同様の仕組みがありますね。セキュリティのためにも、ソフトウェアは最新の状態を保つのがいいです。だから、このアプリが自動的に起動されるのも分かりますが、正直うっとうしいです。特に、セミナーをやっているとき、不意に「更新があります」という画面が表示される
プログラミングの世界では、よく論理値という仕組みが使われます。 論理値には TRUE (トゥルー) 「真実の」「本当の」などを意味する英単語 FALSE (フォルス) 「偽りの」「誤った」などを意味する英単語 の2つがあります。 ザックリ言うと、TRUEは「正しい」でFALSEは「正しくない」ということですが、論理値の仕組みは、プログラミング言語によって微妙に異なります。Excelでは、ワークシート上とVBAで論理値が使われますが、両者も少しだけ挙動が違います。ここでは、ワークシート上で使用される論理値について解説します。 セルに論理値を入力する TRUEは、いわば"正しい"という状態です。下図のセルA1には10が入力されています。10は5より大きいです。したがって「A1>5」は正しいのでTRUEを返します。 上図のように、セルにTRUE(という状態)が入力されると、セルには「TRUE」と
Sub Sample1() Dim Target As Worksheet Target = ActiveSheet Target.Name = "Sample" End Sub これは、よく見るエラーメッセージです。 上のコードは、オブジェクト変数Targetにアクティブシート(への参照)を格納して、シート名を"Sample"に変更しようとしていますが、オブジェクト変数に格納するときのSetステートメントがありませんのでエラーになります。正しくは次のようにします。 Sub Sample2() Dim Target As Worksheet Set Target = ActiveSheet Target.Name = "Sample" End Sub また、そもそもオブジェクトを格納していないオブジェクト変数を操作しようとしたときにも発生します。 Sub Sample3() Dim Tar
シートのコピーはCopyメソッド シートをコピーするときはCopyメソッドを使います。ここでは「○○は××メソッドです」と簡単に説明していますが、使用するメソッドやプロパティがわからないときは、まず実際の操作をマクロ記録してくださいね。 さて、WorksheetオブジェクトのCopyメソッドには次の引数があります。 Copy(Before, After) 引数Beforeと引数Afterは、それぞれコピー先の位置を指定します。「Before:=Worksheets("Sheet2")」なら、コピーされた新しいシートがSheet2の直前に挿入されます。Addメソッドとよく似ていますが、1つだけ注意が必要です。Addメソッドと違い、引数Beforeと引数Afterを同時に指定することはできません。たとえ両方で矛盾のない位置を指定してもいけません。 Copyメソッドは異なるブックに存在するシート
それが書かれているモジュールでは、変数を宣言しないと使えませんという命令です。 Option Explicit を書いていないモジュールでは エラーになりません。 変数は、絶対宣言してください。自分のためです。変数の宣言が難しいと感じて、宣言をしないで使っている方、難しいのは「宣言」ではなく「変数の型」ではありませんか?だったら、変数の型指定は省略してもかまいません。その代わり「宣言」だけはします。「Dim A」のように。これなら難しくありませんよね。 変数宣言の重要性と、なぜ多くの方は宣言をしないのかの考察については、下記ページをご覧ください。 変数って宣言しなくちゃいけないの? Option Explicitは、宣言セクションに記述します。宣言セクションとは、マクロを書くウィンドウの中で、先頭のプロシージャよりも上の部分です。 すべてのモジュールで、宣言セクションにOption Exp
引数varnameにユーザー定義型を指定することはできません。 サンプル 次の例は、バリアント型変数の内部処理形式を表示します。 Sub Sample() Dim var As Variant var = "ABC" MsgBox VarType(var) '8を表示します var = 123 MsgBox VarType(var) '2を表示します var = 123.456 MsgBox VarType(var) '5を表示します var = Array("A", "B", "C") MsgBox VarType(var) '8204を表示します End Sub
ファイルから読み込む 最初は、次のようなテキストファイルを例にします。 ファイルの場所(フルパス)は「C:\Sample\Data.txt」とします。このファイルから、1行ずつ読み込んでセルに代入してみましょう。 テキストファイルから1行ずつ読み込むには、Line Inputステートメントを使います。 Line Input #番号, 変数 Sub Sample1() Dim buf As String Open "C:\Sample\Data.txt" For Input As #1 Line Input #1, buf MsgBox buf Close #1 End Sub Line Inputステートメントは、1行分のデータを読み込むと、読み取りポイントを次の行に移します。つまり、Line Inputステートメントを繰り返すことで、テキストファイルの中を、1行ずつ、すべて読み込むことが
下図のように氏名が入力されているとします。苗字と名前の間には半角スペースが1つ。こうしたデータを半角スペースで分割するには、どうしたらいいでしょう。 このネタは、よくワークシート関数の問題に出ますね。ワークシート関数で分割するなら、次のようにします。 もちろん、関数で分割してもいいのですが、ビギナーにはちょっと"敷居が高い"のと、その後、数式の結果を"値貼り付け"しなければならないなど、面倒くさいですね。このようなデータを分割するには、便利な機能があります。[区切り位置]機能です。やってみましょう。 まず、文字列が入力されているセル範囲を選択します。ここでは、セル範囲A2:A5ですね。続いて、[データ]メニューの[区切り位置]を実行します。Excel 2007では、[データ]タブ[データツール]グループの[区切り位置]ボタンです。 実行すると[区切り位置指定ウィザード]ダイアログボックスが
VBAでは、ソースコードの途中にコメントを記述することができます。 コメントには、そのマクロがどんな動作を行うかとか、そこで指定している数値の意味とか、あとでマクロを編集するときに役立つ情報を記述しておきます。 では、セルに入力した数式に、何らかのコメントを記述したいときはどうしましょう。Excelには、その名の通り「コメント」という機能がありますので、(数式ではなく)セルにコメントを挿入するのが一般的です。 その数式にとって必要な注釈や情報を、数式に影響しない状態で記述するという点では、こうしたセルのコメントは有効ですし、これがセオリーといってもいいでしょう。しかし、コメントは誰にでも読まれてしまいます。たとえば、セルの数式が表示されないように設定しても、コメントまで隠すことはできません。Excelの設定を変えて、コメントが表示されないようにすると、今度は自分も読めなくなってしまいます。
次のページ
このページを最初にブックマークしてみませんか?
『Office TANAKA』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く