ブックマーク / officetanaka.net (21)

  • Office TANAKA - Excel VBA Tips[連想配列を使う]

    のようにデータを格納しておいて、「Japan」というキーで「日」を探し出す機能です。 「VBAで連想配列は使えますか?」とか「VBAには連想配列がないからな~」などという話をたまに聞きますが、Excel VBA使いとしては「??」という気がしてなりません。だって、いつもワークシート上で普通にやってることですから。 Excel VBAに連想配列という機能はありませんが、データを変数ではなくワークシート上のセルに格納することで、連想配列のような使い方ができます。ちなみに、かなり高速ですよ。20,000件のデータをランダムに並べ、20,000件目のデータを検索するのに要した時間は20ミリ秒でした。CPUは1GHzでメモリは512MBの環境です。 ひとつだけマクロ例を提示しておきますね。 Sub Sample1() ''データの検索 Dim buf As String buf = InputBo

  • Office TANAKA - 数式のエラー[#####]

    エラーの原因2 「#####」が表示されるもうひとつの原因があります。それは時間の計算で、数式の結果がマイナスになる場合です。 上図は、セルA1の「17:00」からセルA2の「11:00」を引いています。セルC2には「=A1-A2」という数式を入力しました。セルA1の時刻の方がセルA2より大きいので、セルC2には正常に「6:00」という差が表示されています。 ここで、セルA1の時刻を「9:00」にしてみましょう。こんどはセルA1の時刻がセルA2の時刻より小さくなり、計算結果がマイナスになったので「#####」が表示されます。 Excelでは日付や時間を「シリアル値」という連続した特別の値で管理しています。このシリアル値を計算することで、日付間の日数や、何時から何時までという時間の差を簡単に計算することができます。ただし標準のシリアル値では、マイナスの時間を表示することができません。「9:0

    Office TANAKA - 数式のエラー[#####]
  • Office TANAKA - Excel VBA Tips[クリップボードを操作する]

    クリップボードに格納されている形式を調べる クリップボードに、どんな形式のデータが格納されているかは、ApplicationオブジェクトのClipboardFormatsプロパティで判定できます。ClipboardFormatsプロパティは、クリップボードに格納されているデータ形式を配列で返します。クリップボードに何もデータが格納されていない場合は、ClipboardFormats(1)にTrue(-1)が入ります。 クリップボードにどんな形式のデータが格納されているかは、ClipboardFormatsプロパティが返す配列の要素と定数を比較します。次のサンプルは、クリップボードに画像が格納されていたらワークシートに貼り付けます。 Sub Sample() Dim CB As Variant, i As Long CB = Application.ClipboardFormats If C

  • Office TANAKA - Excel Tips[空欄を計算するとエラーになる]

    セルの数値を合計するときは「=A1+A2」のようにセルのアドレスを計算します。しかし、こうした簡単な数式が予期せぬエラーになることがあります。それは空欄("")を計算しようとしたときです。 下図の表で解説します。セル範囲A2:A3には数値を入力してあります。右隣のセル範囲B2:B3には、A列が空欄だったら空欄、空欄でなかったらA列の数値を2倍するという簡単なIF関数を入力しました。セルB4では「=B2+B3」という参照式で合計を求めています。 特に難しいことをしているわけではありません。ところが、セルA3の数値を[Delete]キーなどで削除するとどうなるでしょう。 セルB4の数式がエラーになってしまいました。これは「=IF(A2="","",A2*2)」という数式が原因です。このIF関数では、A列のセルが空欄だったとき「空欄("")」を返すように指示しています。この「空欄("")」は数値

    Office TANAKA - Excel Tips[空欄を計算するとエラーになる]
  • Office TANAKA - Excel VBA Tips[グラフの参照範囲を変更する]

    グラフの操作に関しては、いずれまとめようと思っていましたが、とりあえずこれだけ。既存グラフの参照範囲(元データ)を、マクロで変更するにはどうするかって話です。なお、ここではExcel 2010の画面で解説していますが、Excel 2003でも動作確認をしています。 なお、マクロを使わないで、ワークシート関数だけで自動的に変更するやり方は、下記ページをご覧ください。 グラフの参照範囲を自動的に変更する 下のような表からグラフを作ります。 たとえば、こんなグラフを作りました。 この表に「10月」のデータが追加されました。 当然、グラフで参照している元データも変更しなければなりません。これをマクロでやってみましょう。 方法1:SetSourceDataメソッドで指定する グラフの参照元を指定するには、2つの方法があります。1つは、ChartオブジェクトのSetSourceDataメソッドで元デー

  • Office TANAKA - Excel VBA Tips[他ブックのマクロを実行する]

    Excel 上で 2 つのブックを開いていたとします。ここでは仮に「Book1.xlsm」と「Book2.xlsm」としましょうか。 「Book1.xlsm」には『Sub Test1』というマクロがあり、「Book2.xlsm」には『Sub Test2』というマクロがあったとします。 ここで、Test1 から Test2 を実行しようと次のように書くとエラーになります。 Sub Test1() Call Test2 End Sub Book1.xlsm には Sub Test2 がありませんので、Sub プロシージャが見つかりません というエラーです。来のやり方は、Book1.xlsm から Book2.xlsm を参照設定すればよいのですが、これは面倒くさいです。 他ブックのプロシージャを実行するときは、Call メソッドではなく Run メソッドを使いましょう。 Sub Test1(

  • Office TANAKA - Excel VBA関数[InStr]

    一般的なVBAでは、文字列がNullになることは少ないので、Null値を返すことはないです。見つかったら1以上の数値を返し、見つからなかったら0を返す、と覚えておけばいいでしょう。 サンプル 次の例は、「ABCDE」の中から「D」を検索してその位置を表示します。 Sub Sample1() Dim String1 As String, String2 As String String1 = "ABCDE" String2 = "D" MsgBox InStr(String1, String2) End Sub 所見 InStr関数は、とても役に立つ関数です。ただし、単独で使うことは希でしょう。上記サンプルのように、ただ文字の位置を調べて終わるという作業は、実務ではほとんどありません。文字の位置を調べて、それを元に次の処理を行うのが一般的です。たとえば、セルに「田中 亨」のようなデータが入力

  • Office TANAKA - Excel VBA Tips[指定した時刻にマクロを起動する]

    最近Mac版のExcel 2008を触っているのですが、Windows版にはない機能などがあって、なかなか楽しいです。何より、今までわず嫌いしていたMacintoshがおもしろいです。基的な操作で悩むことも多いのですが、それがまた、パソコンを始めた頃のような新鮮さです。 MacExcel 2008には「タイマー機能」があります。指定した時間がくるとメッセージが表示される機能です。Excel 2008だけで実現しているわけではありませんが、なかなか楽しい機能です。そういえば、Windows版のExcelでも、指定した時刻にマクロを起動する機能がありましたっけ。ちなみに、Excel 2008にはVBAが搭載されていません。、 指定した時刻にマクロを起動するには、ApplicationオブジェクトのOnTimeメソッドを使います。 OnTimeメソッドの書式は次の通りです。 OnTime(

  • Office TANAKA - Excel VBA Tips[結合セルを調べる]

    セルを結合するにはRangeオブジェクトのMergeメソッドを実行します。 Sub Sample1() Range("A1:B3").Merge End Sub こんな感じです。実行するとセル範囲A1:B3が結合されます。ちなみに結合を解除するにはUnMergeメソッドを実行します。 さて、セルを結合したり解除したりするのは簡単ですが、任意のセルが結合されているかどうかを調べるにはどうしたらいいでしょう。実は今やってる仕事の支援システムを作っていて、この判断が必要になりました。そんなに難しいテクニックではありませんが、意外と知られていないようなので、せっかくですからご紹介しましょう。 ここでは上図のようなシートを例にします。セル範囲A3:A4とセル範囲A6:A8が結合されています。B列は結合されていません。よくみかけるレイアウトですよね。 結合セルの判定で役立つのはMergeCellsプロ

  • Office TANAKA - ワークシート関数[OFFSET 関数]

    OFFSET関数に関して、詳しい説明や具体的な使い方などを動画で解説しています。ぜひ、ご覧ください。Youtubeでは、ほかにもたくさんの動画を公開しています。チャンネル登録をお忘れなく! Office TANAKAチャンネル 書式 :OFFSET(基準,行数,列数,高さ,幅) 機能 :基準セルを指定した数だけシフトしたセル範囲を返します 解説 :セル範囲を可変にするときに使います OFFSET関数の仕組み OFFSET関数は理解しづらい関数のひとつです。しかし、その仕組みを理解できれば、これほど役に立つ関数はありません。まず、OFFSET関数は何をどうする関数なのかを理解しましょう。 OFFSET関数の構文は次の通りです。 OFFSET(基準,行数,列数,高さ,幅) OFFSET関数に指定する引数は、次の3種類に分類できます。 1.基準となるセルを指定する引数→[基準] 2.基準セルを動

  • Office TANAKA - ListViewコントロールの使い方[Excelでの使用例]

    ListViewコントロールを使ってコメントを管理する例を紹介します。TreeViewコントロールと組み合わせて使うとさらに効果的ですが、ここではListViewコントロールを中心に作ってみましょう。TreeViewコントロールについては、「UserFormでツリービューを使う」をご覧ください。 こんなイメージです。 ListViewコントロールの初期化とコメントの取得 ListViewコントロールの初期化は、前に解説した通りです。列見出し(ColumnHeader)を追加するとき、同時に列幅も指定しています。 続いて、アクティブシートにあるすべてのコメントを取得します。なお、項ではコメントに関する技術的な解説は割愛いたします。それは、また別のコンテンツで解説しましょう。 Private Sub UserForm_Initialize() Dim Memo With ListView1

  • Office TANAKA - Excel VBA Tips[Dir関数でサブフォルダを取得する]

    複数の属性を指定するときは、定数を合計します。たとえば「読み取り専用」の「隠し属性」ファイルを調べたいのなら、 Sub Sample2() Dim buf As String, msg As String buf = Dir("tanaka*.*", vbReadOnly + vbHidden) Do While buf <> "" msg = msg & buf & vbCrLf buf = Dir() Loop MsgBox msg End Sub とします。しかし、この引数は実に使いにくいです。たとえば今、フォルダに次のファイルが保存されていたとしましょう。 Book1.xls … 標準ファイル Book2.xls … 読み取り専用ファイル Book3.xls … 隠しファイル このとき、上のSample2を実行すると次のような結果になります。 vbReadOnly + vbHidd

  • Office TANAKA - Excel VBA関数[StrConv]

    定数vbWideと定数vbNarrowは、国別情報が中国韓国、日の場合に適用されます。引数vbKatakanaと引数vbHiraganaは、国別情報が日の場合に適用されます。 引数 string を指定したあとで、カンマ(,)を入力すると、次の引数 conversion で指定できる定数がリストに表示されます。 サンプル 次の例は、文字列を変換した結果を表示します。 Sub Sample() Dim str As String str = "abcDEFGHI" MsgBox StrConv(str, vbUpperCase) 'ABCDEFGHIを表示します MsgBox StrConv(str, vbLowerCase) 'abcdefghiを表示します MsgBox StrConv(str, vbProperCase) 'Abcdefghiを表示します MsgBox StrCo

  • Office TANAKA - Excel VBA Tips[ブックを開かないでセルのデータを読む]

    このコンテンツは、かなり昔に書きました。正確な時期は覚えていませんが、ワークシートの大きさが65,536行より小さいブックに関して触れていましたので、おそらく1998年前後に書いたのではないかと。22年前かぁ…w 内容もちょっとアレですし、書き足したいこともありますので、全面的に書き直します。ちなみに今は、2020年9月です。 なお、稿と"ほぼ"同じ内容をYouTubeの動画で公開しています。稿とは違い、100個のブックから読み込んで所要時間を計測していますので、興味のある方はご覧ください。稿は、1つのブックから読み込むという基的な方法と、動画では伝えきれなかった"制約"に関して詳しく解説します。 Excel 4.0マクロで読み込む 原則としてExcelVBAは、Excel上に読み込んだブックを扱います。Excel上に開いていないブックは、原則として操作できません。この原則は、し

  • Office TANAKA - Excel VBA関数[DoEvents]

    構文 DoEvents() 引数はありません。 解説 発生したイベントがオペレーティングシステムによって処理されるように制御を戻します。 時間のかかる処理を実行している場合、ユーザーが行った操作は処理が終了するまでオペレーティングシステムに渡りません。処理を中断するような場合は、DoEvents関数で一時的にオペレーティングシステムに制御を移し、イベントの処理を行います。 サンプル 次の例は、Forループの実行中Command1がクリックされると処理を中断します。 Dim fStop As Boolean 'グローバル変数を宣言 Sub Sample() Dim i As Long fStop = False For i = 1 To 500000 DoEvents If fStop = True Then MsgBox "処理が中断されました" Exit For End If Next

  • Office TANAKA - ファイルの操作[ファイルの存在を調べる]

    美しいマクロは「頑強性」を持っています。どんな環境でも、ユーザーがどれほど予想外の操作をしても、滅多なことでは停止しないマクロを目指しましょう。それには「○○のはず」という固定概念を払拭するのがポイントです。「ここにファイルがあるはず」「シート名はSheet1のはず」などなど、固定概念が多いマクロほど思わぬトラブルを招くものです。 たとえば、次のコードは、ブックを開く簡単なマクロです。 Sub Sample1() Workbooks.Open "Book2.xlsx" End Sub シンプルですけど、これはマズイですね。「Book2.xls」にパスを指定していませんから、これでは「カレントフォルダのBook2.xls」になってしまいます。カレントフォルダは、Excelでブックを開いたり保存したりするだけでも変わりますから、Book2.xlsxが見つからない場合もあります。明示的にカレント

  • Office TANAKA - Excel VBA Tips[Split関数で文字列を区切る]

    ※文字列を、区切り文字ではなく、位置で分割するやり方は「文字列を位置で分割する」をご覧ください。 Split関数は、ある区切り文字で区切られた文字列を、その区切り文字で区切り、区切られた各文字列を、一次元配列として返します。言葉で表すとややこしいですが、要するに次のような処理をしてくれます。 Split関数の書式は次の通りです。 Split(元の文字列 , 区切り文字) 上の例なら、次のようになります。 Split("123,田中,tanaka" , ",") Split関数は配列を返します。したがって、それを受け取る変数は、バリアント型変数か、動的配列でなければいけません。一般的にはバリアント型変数に受けます。Split関数の返り値(配列)を受け取ったバリアント型変数は、それ以降、配列として操作できます。 このとき注意しなければいけないのは、Split関数が返す配列の要素は0から始まると

    m_sasaki0810
    m_sasaki0810 2010/09/21
    split関数で文字を区切る
  • Office TANAKA - Excel VBA Tips[ホームページ(URL)を開く]

    VBAでホームページを開くにはいくつかの方法があります。 ExcelのHyperlinkを使う方法(1) ExcelのHyperlinkを使う方法(2) 拡張子関連づけで開く方法(1) 拡張子関連づけで開く方法(2) IEを指定して開く方法(1) IEを指定して開く方法(2) ExcelのHyperlinkを使う方法(1) Excelには指定したURLを開くハイパーリンク機能があります。これを使うと、VBAから指定したページを開くことができます。次のコードは、セルA1に定義されているハイパーリンクを実行します。 Sub Sample1() Range("A1").Hyperlinks(1).Follow NewWindow:=True End Sub HyperlinkオブジェクトのFollowメソッドは、指定したハイパーリンクをクリックするのと同じ動作を実行します。開きたいURLが、セル

    m_sasaki0810
    m_sasaki0810 2010/09/17
    ハイパーリンクの追加
  • Office TANAKA - Excel VBA Tips[メールを送信する]

    このテクニックはBASP21を使います。 BASP21については、ご自身で調べてくださいな。 BASP21を使うとメールの送受信が簡単に行えます。まずはメールの送信から。なお、サーバー名やアカウント、パスワードなどはサンプルです。このコードをそのまま実行するとエラーになりますので、ご利用の環境に合わせてサーバー名やアカウント、パスワードなどを適切に設定してください。 Sub Sample() Dim bobj, msg As String Dim Server As String, Mailto As String, MailFrom As String, Subject As String, Body As String Set bobj = CreateObject("basp21") ''BASP21オブジェクト Server = "smtp.xxxxx.com" ''SMTPサーバ

    m_sasaki0810
    m_sasaki0810 2010/09/17
    BASPを使用して
  • Office TANAKA - VBAの実行時エラー

    主な実行時エラーです。気がついたら追加します。なお、エラーメッセージは、Excelの(というかVBAの)バージョンによって変わることがあります。

    m_sasaki0810
    m_sasaki0810 2010/09/08
    実行時エラー一覧。これは助かる。