タグ

ブックマーク / officetanaka.net (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サーバ

  • Office TANAKA - VBA高速化テクニック

    2018年12月に、すべて検証し直して、コンテンツも新しくしました。コンテンツは1995年頃パソコン通信「NIFTY-Serve」に書いたものがベースになっていますが、パソコンの性能が向上したことによって、理論的には遅いけど実際には影響ないということもあります。そのへんを検証し直しました。 また「VBA高速化"テクニック"」と言っていますが、来であれば"テクニック"以前の問題が多いです。たいてい私に「田中さん、マクロが遅いので見てください」と質問されるときは「そもそも、なんでそんなコード書くの?」というマクロばかりです。まずは「 無駄なSelectをしない」「 余計なことはしない」あたりを、よ~く注意してください。それだけで十分高速になります。さらに、マクロ全体の構成や"考え方"も検討してください。プランAでは遅かった。じゃ、プランBでやってみよう。それでも遅かったらプランCで。という

  • Office TANAKA - VBAの実行時エラー

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

  • Office TANAKA - Excel VBA Tips[日付・時刻を取得するときの落とし穴]

    先日メールで「Date関数の返り値がおかしい」という質問を受けて思い出しました。今回は"役立つテクニック"ではなく、Windowsの設定によって関数の返り値が変わるという"落とし穴"の話です。 VBAで現在の日付を調べるときはDate関数を使います。現在の時刻ならTime関数、日付と時刻を両方同時に調べたいときはNow関数を使います。けっこう基的なテクニックですし、ご存じの方も多いでしょう。たとえば次のような使い方です。 Sub Sample1() Dim buf As String buf = Now & vbCrLf & Date & vbCrLf & Time MsgBox buf End Sub 実行すると次のようになります。 このとき日付はyyyy/mm/dd形式、時刻はH:mm:ss形式のデータが返りますが、この形式は固定されたものではありません。実はWindowsの設定によ

  • Office TANAKA - Excel VBA Tips[APIを使わないで実行中のタスク一覧を調べる]

    Excel VBAのTipsとしては、かなりの反則だと思います。だって、Excel VBAの機能ではないのですから。 これは、先日作成していたマクロで、どうしてもこの情報が必要になり、あれこれ探していたら偶然見つけたテクニックです。見つけたときに思ったのは「えぇ~ズルい!」という印象でした(^^; 現在実行しているすべてのソフトを調べるには、タスクマネージャを起動して[アプリケーション]タブを開きます。ここにリストされる「プロセス一覧」をプログラムから取得するには、WindowsAPIや、WMI(Windows Management Instrumentation)などを使うのが一般的です。この「プロセス一覧」をVBAだけで取得しようというのが今回のテーマです。次のようにやります。 Sub Sample1() Dim WD, task, n As Long Set WD = Create

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

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

  • Office TANAKA - VBA高速化テクニック[配列を使う]

    パソコン通信時代に書いた、この「VBA高速化テクニック」の中で、間違って伝わっているな~と感じていたのは、冒頭の「画面を止める」と、これ「配列を使う」です。90年代のパソコンはスペックが低かったです。CPUは遅いし、メモリも少なく低速、Windowsの画面描画機能も遅かったし、そもそもExcelもそれほど速くはなかったです。そんな中で、大量のセルにアクセスするのなら、一度配列に入れて配列を操作する方が速いよって話でした。でも、何となく「配列に入れると速い」ということだけが一人歩きして、とにかく何でも「配列は速い!配列は速い!配列!配列ぅ!」って言われてます。 ちょっとやってみましょうか。まずは単純に、データを探す操作から。A列に200,000個の名前が入っています。この中から"田中"を探して、該当するB列の数値を取得します。ちなみに"田中"は一番下のセルA200000にあります。 Sub

  • Office TANAKA - VBAでVBEを操作する[CodeModuleのプロパティ]

    一般的なSubプロシージャやFunctionプロシージャを指定するときは0を指定します。 Sub Sample10() Dim Cnt As Long Cnt = ThisWorkbook.VBProject.VBComponents("Module1"). _ CodeModule.ProcBodyLine("Sample10", 0) MsgBox Cnt End Sub ProcCountLinesプロパティは、指定したプロシージャの行数を返します。 指定する引数はProcBodyLineプロパティと同じです。 ProcCountLinesプロパティは、指定したプロシージャの宣言行(Sub ○○やFunction××など)以前にある空白行やコメント行から、プロシージャの終了行(End SubやEnd Functionなど)までの行数を返します。指定したプロシージャがコードモジュール内

  • Office TANAKA - VBAのステートメント[SendKeys]

    SendKeysステートメント 構文 SendKeys string[,wait] stringには、アクティブウィンドウに渡すキーストロークを指定します。 waitは省略かのうです。Trueを指定すると、キーストロークが渡るまで処理を中断します。 解説 アクティブウィンドウに対して、キーボードから入力したのと同じようにキーストロークを渡します。 「3」や「A」などの文字は、ダブルコーテーションで囲って指定します。バックスペースやファンクションキーは{BACKSPACE}{F1}と、特殊なコードを指定します。Shiftキー、Ctrlキー、Altキーと同時に押すキーストロークは、「+」「^」「%」と合わせて指定します。 例 コマンド 意味

  • Office TANAKA - セルの操作[セルのコピー]

    マクロ記録の落とし穴 マクロによるセルのコピーは、ビギナーとベテランで最も差が出るコードのひとつです。たとえば、セルA1をセルC2にコピーするコードを考えてみましょう。この操作をマクロ記録すると、次のようなコードが生成されます。 Sub Macro1() Range("A1").Select Selection.Copy Range("C2").Select ActiveSheet.Paste End Sub なるほど、確かに間違っていませんが、決して美しいコードではありません。このコードを参考にして、Sheet1のセルA1をSheet2のセルC2にコピーするコードを作ってみましょう。おそらく次のようになると思います。 Sub Sample1() Worksheets("Sheet1").Select Range("A1").Select Selection.Copy Worksheets

  • Office TANAKA - Excel VBA Tips[MS-DOSコマンドの標準出力を取得する]

    またもや「Excel VBAと関係ねぇじゃねーか!」と言われそうですが、今回はMS-DOSコマンドの標準出力を変数に取得する方法を解説します。これはもう、Excelとは関係ないVB系のネタなんですね。ただ実行環境がExcelってだけで(^^; ま、いーや書いちゃえ。MS-DOSって何のことだかわからない人は、自分で調べてください(^^; なお、ここではWindows XP Home Editionを例に解説します。 MS-DOSのコマンドには今でも便利に使えるものが多いですし、何よりネットワークを管理されている方は必須コマンドです。VBやVBAからMS-DOSコマンドを実行するときには、問題が2つあります。1つめはShell関数で起動できないことです。MS-DOSコマンドはいわゆるDOS窓で起動する仕組みになっていますので、Shell関数では起動できません。2つめの問題は、実行結果もDOS

  • Office TANAKA - Excel VBA Tips[実は奥が深いInputBox]

    マクロ実行中にユーザーから文字列や数値を受け取るとき、最も簡単な方法のひとつはInputBoxを使うことです。次のコードは、ユーザーに名前を入力してもらい、入力された文字列をセルA1に書き込みます。 Sub Sample1() Dim buf As String buf = InputBox("名前を入力してください") Range("A1") = buf End Sub 特に難しいテクニックでもなく、ややもするとVBAの解説でさえ紹介されないこともある基ワザですが、実はこのInputBoxは意外と奥が深いんです。 InputBoxは2つある まず衝撃的な事実からお話ししましょう。Excel VBAで使えるInputBoxには次の2種類があります。 InputBox関数 ApplicationオブジェクトのInputBoxメソッド ひとつはInputBox関数です。文字列の左端を抜き出

  • 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 Tips[フォルダを選択するダイアログ]

    フォルダを選択するダイアログボックスを表示するにはいくつかの方法があります。 1.FileDialogオブジェクトを使う方法 Sub Sample1() With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then MsgBox .SelectedItems(1) End If End With End Sub 2.Shellを使う方法 Sub Sample2() Dim Shell, myPath Set Shell = CreateObject("Shell.Application") Set myPath = Shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\") If Not myPath Is Nothing Then Ms

  • Office TANAKA - VBA Tips

    VBAコンテンツ Home Excel VBA Excel VBA Tips セル セルが選択されているか判定する アクティブでないシートのアクティブセル 結合セルを調べる 簡単に罫線を引く セルのValue2プロパティ あるセルがセル範囲に含まれるかどうか セル範囲の操作 確実に選択されているセルを操作する 入力されているデータの最終セルを取得する 複数のセルを選択する 特定のセル範囲内を検索する 非表示のセルを検索する すべて検索する 日付を検索する 1と001の問題 Range(左上セル, 右下セル)の使い方 セルの罫線に関すること new オートフィルタ 書き方の基 文字列で絞り込む 数値で絞り込む 日付で絞り込む 色で絞り込む 作業列で絞り込む 絞り込んだ結果をコピーする 絞り込んだ結果を集計する 絞り込んだ結果の行を操作する オートフィルタの状況を判定する 数式のエラーで絞り

  • Office TANAKA - Excel VBA Tips[ワークシートの名前を変更する]

    ワークシートの名前を変更するにはどうしたらいいでしょう。え?簡単ですって?なるほど、次のようにWorksheetオブジェクトのNameプロパティに変更したい名前を指定すればいいんですね。 Sub Sample1() ActiveSheet.Name = "合計" End Sub はい、確かにその通りです。ですが、今回のテーマはちょっと違います。 たとえばExcelで入力作業をしていたとします。そんなとき、シートの名前を変更したくなったらどうしますか?普通はシート見出しをダブルクリックして、新しいシート名を入力します。でも、入力作業を続けているときって、両手がキーボード上にありますよね。できればマウスを使わずに、キーボードだけで新しい名前に変更したいものです。それもInputBoxなんか使わないで、シート見出し上で直接入力したいです。 マクロを使わない方法もあります。 [Alt]キーを押しな

  • 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が、セル

  • 1