タグ

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

  • Office TANAKA - Excel VBA Tips[ステータスバーを使う]

    処理の完了までに長い時間がかかる場合は、何らかの方法でユーザーに「現在処理中です...」と伝えたいものです。Windowsの標準機能などでは、ファイルを削除したりコピーしたりするとき、バーが右に伸びることで処理の進捗状況を伝えます。このバーを「プログレスバー」と呼びますが、こうした仕組みをExcelで実現するときは、ステータスバーを使うのが簡単です。 ステータスバーはExcelの最下部に表示されるバーで、通常は「コマンド」とか「編集」「入力」などと表示されます。また、セルのコピー中には「コピー先を選択して~」などと操作の手順をナビゲートしてくれます。ステータスバーにメッセージを表示するには、ApplicationオブジェクトのStatusBarプロパティに表示したい文字列を設定します。次のコードは「○回目の処理をしています...」をステータスバーに表示します。 Sub Sample01()

    kiyo_hiko
    kiyo_hiko 2019/04/25
    超重い処理させるときに進捗を知らせる
  • Office TANAKA - Excel VBA Tips[CPUの使用率を抑える方法]

    何か、すごく時間のかかるループを実行すると、処理が終わるまでCPUの使用率が100%近くになることがあります。 Sub Sample1() Dim buf As String Const LogFile As String = "C:\log\ex090310.log" Open LogFile For Input As #1 Do Until EOF(1) Line Input #1, buf Debug.Print buf Loop Close #1 End Sub 上記の"C:\log\ex090310.log"は、サーバーのログファイルです。テキストファイルで約45MB、約20万行あります。さすがに、このボリュームになると、Line Inputで1行ずつ読むのには時間がかかります。そして、処理が終わるまで、CPUの使用率はずっと100%となります。 マクロが終わるまで、コーヒーでも

    kiyo_hiko
    kiyo_hiko 2019/04/25
    超重い処理させるときにお行儀よくする
  • Office TANAKA - VBAのステートメント[Type]

    Typeステートメント 構文 [Private|Public] Type varname elementname[([subscripts])] As type End Type キーワードPublicは省略可能です。すべてのモジュールから参照できるユーザー定義型を宣言します。 キーワードPrivateは省略可能です。Typeステートメントを記述したモジュールからのみ参照できるユーザー定義型を宣言します。 varnameには、ユーザー定義型の名前を指定します。 elementnameには、ユーザー定義型を構成する要素の名前を指定します。 subscriptsは省略可能です。配列変数の次元を指定します。 typeには、ユーザー定義型を構成する要素のデータ型を指定します。 解説 ユーザー定義のデータ型を作成します。 Typeステートメントは、プロシージャレベルで使用します。 標準モジュール内で

  • Office TANAKA - Excel VBA Tips[入力されているデータの最終セルを取得する]

    これは基的なテクニックだと思って今まで解説しませんでしたが、セミナーなどで質問が多かったので、簡単に書いておきます。たとえば、下図のようなリストがあったとします。 この、現在入力されている最終セル(あるいは最終行)を取得するには、どうしたらいいでしょう。 Excelに詳しくない、VBAのプログラミング的なことしか知らないような方でしたら、次のように考えるかもしれませんね。「A列を上から順番に見ていって、空欄セルが見つかったら、その直前が最終セル」だと。その方法でやってみましょうか。 Sub Sample1() Dim i As Long, r As Long For i = 1 To 10000 Range("A" & i).Select If Selection = "" Then r = i - 1 Exit For End If Next i Range("A" & r).Sele

    kiyo_hiko
    kiyo_hiko 2019/04/24
    Rows.count(物理最終行)からさかのぼって入力値セルを見つける方法。多分一番確実
  • Office TANAKA - ファイルの操作[UTF-8形式のテキストファイルから読み込む]

    稿で紹介する「テキストファイルの操作」は、UTF-8形式のテキストファイルを対象にしています。Shift-JIS形式のファイルを扱うときは、下記ページをご覧ください。 テキストファイルを操作する 正確には「UTF-8形式のファイル」ってのも、ちょっと変な表現なんですけどね。ファイルの形式じゃなくて、そこで使われている文字コードが"UTF-8"だよってことなんですが。まぁ、細かいことはいいとして。ここでは面倒なので「UTF-8形式のファイル」「Shift-JIS形式のファイル」という呼び方をします。 UTF-8の文字コードが記録されたテキストファイルを、上記「テキストファイルを操作する」で解説した方法で読み込むと、望んだ結果になりません。ちょっと、やってみましょう。 UTF-8の文字コードで書かれたデータを読み込むときは、ADO(ActiveX Data Objects)という仕組みを使い

    Office TANAKA - ファイルの操作[UTF-8形式のテキストファイルから読み込む]
    kiyo_hiko
    kiyo_hiko 2019/04/24
    ReadText:まるごと読み取り
  • Office TANAKA - 変数の使い方[複数のデータ型をまとめるユーザー定義型]

    ユーザー定義型は、C言語でいう構造体のような仕組みです。 一般的な変数には、1つの値しか格納できません。配列には複数の値を同時に格納できますが、それは同じ型の値です。名前(文字列型)と年齢(長整数型)のように、異なる型の値をセットにして格納するには、配列ではなくユーザー定義型が便利です。ユーザー定義型は、次のようにして使います。 Type ○○ 要素1 As 型 要素2 As 型 End Type Sub Sample() Dim 変数名 As ○○ 変数名.要素1 = 値 変数名.要素2 = 値 End Sub ユーザー定義型の定義は、宣言セクションでします。宣言セクションとは、モジュールの一番上に記述したプロシージャの、さらに上の部分です。変数の宣言を強制するオプションを設定したとき、モジュールに挿入されるOption Explicitや、APIの宣言やパブリック変数の宣言などをするの

    kiyo_hiko
    kiyo_hiko 2015/01/30
    Public Type T: menber As MemberType: End Type
  • Office TANAKA - VBAのステートメント[Function]

    Functionステートメント 構文 [Public | Private | Friend] [Static] Function name [(arglist)] [As type] キーワードPublicは省略可能です。すべてのモジュールから参照できるFunctionプロシージャを宣言します。 キーワードPrivateは省略可能です。Functionプロシージャを記述したモジュールからのみ参照できるFunctionプロシージャを宣言します。 キーワードFriendは省略可能です。クラスモジュール内で使用します。 nameには、Functionプロシージャの名前を指定します。 引数arglistは省略可能です。Functionプロシージャが受け取る引数リストを指定します。 typeは省略可能です。Typeには、Functionプロシージャの返り値の型を指定します。 解説 Functionプ

    kiyo_hiko
    kiyo_hiko 2014/10/30
    VBAのoptional引数は、isMissing述語で省略されたかを判定するらしい
  • Office TANAKA - セルの操作[セル範囲の取得]

    操作の対象セル範囲が不定の場合 ここまでの解説では、操作の対象を「セルA1に」とか「セル範囲A1:C3に」などと簡単に決めてきました。もちろん解説なのですから、それは勘弁していただきたいのですけど、実際のマクロ作成では操作の対象を特定することに苦労するものです。操作の対象セルを、どう的確に特定するかが、VBAのビギナーとベテランで差が出るところでもあります。たとえば、次のようなデータを考えてみましょう。 このデータをマクロでクリアします。ただし、データが何行何列あるかは、そのときによって異なります。セルをクリアするにはRangeオブジェクトのClearContentsメソッドを使います。次のコードはセル範囲A1:D5をクリアします。 Sub Sample1() Range("A1:D5").ClearContents End Sub クリアすべきセル範囲の左上はセルA1です。したがって、セ

  • Office TANAKA - Excel VBA Tips[テキストファイルを読み上げる]

    Excel 2002から追加された機能にSpeakメソッドがあります。Speakメソッドは任意のデータを読み上げる命令で、次のように使います。次のコードは、セル範囲A1:A4のデータを読み上げます。 Sub Sample1() Range("A1:A4").Speak End Sub けっこう笑えます。 さて、このSpeakメソッドは上記のようにRangeオブジェクトのメソッドですが、実はApplicationオブジェクトの配下にSpeachオブジェクトというのがあり、そのSpeachオブジェクトにも同じSpeakメソッドが用意されています。 Sub Sample2() Application.Speech.Speak Range("A1") End Sub SpeachオブジェクトのSpeakメソッドは引数に単一のテキストを指定しますので、Application.Speech.Speak

    kiyo_hiko
    kiyo_hiko 2013/07/05
    英語で喋ってる 日本語はダメなのかな
  • Office TANAKA - 今さら聞けないVBA[括弧()はどんなときに使うの?]

    VBAでは、どんなときに括弧を使うのか。さらに、巷でよく見かける"文法的に"間違った括弧の使い方なども動画で詳しく解説しています。ぜひ、ご覧ください。Youtubeでは、ほかにもたくさんの動画を公開しています。チャンネル登録をお忘れなく! Office TANAKAチャンネル たとえば、次のようなマクロがあったとします。 Sub Sample1() Dim Re As Long Re = MsgBox("OKですか?", vbYesNo) If Re = vbYes Then MsgBox "それはよかった", vbInformation End If End Sub 上のマクロでは、2つのMsgBoxが使われています。しかし、最初のMsgBoxは引数を括弧で囲っているのに、2番目のMsgBoxは括弧で囲っていません。試しに、最初のMsgBoxで括弧をはずすと、エラーになります。 逆に、2

    kiyo_hiko
    kiyo_hiko 2013/07/04
    記事の説明はすばらしいのだけど、実引数リストをパーレンで囲うとコンパイルエラーとか、何でこんな謎仕様なんだろVBA
  • Office TANAKA - Excel VBA Tips[正規表現によるマッチング]

    VBAから正規表現を使うには、VBScriptが便利です。ただし、正規表現をサポートしているVBScriptはVer5.0からですから、IE5.0がインストールされているパソコンでないと使えません。 VBScriptの中で正規表現エンジンを提供しているのはRegExpオブジェクトです。参照設定によるEarly Bindingか、CreateObject関数を使ったLate Bindingで参照します。ここではLate Bindingによるサンプルを紹介します。 まずは、正規表現で使用するオブジェクトとプロパティやメソッドを整理しましょう。 RegExpオブジェクトのプロパティとメソッド

  • VBAでの改行コード変換

    セル内で改行するには、改行したい位置でAlt+Enterキーを押します。 このとき、入力される改行コードは0A(LF)です。Windowsで使われている一般的な改行コードは0D 0A(CRLF)です。 次のようなコードで確認してみました。 Sub Sample1() Dim buf As String, dmp As String, i As Long buf = Range("B2").Text For i = 1 To LenB(buf) dmp = dmp & Hex(AscB(MidB(buf, i, 1))) & " " Next i MsgBox dmp End Sub Excelは文字データをUnicodeで管理しています。入力したそれぞれの文字に該当する文字コードは次の通りです。 田 : 0x7530 中 : 0x4E2D 1 : 0x0031 2 : 0x0032 3 :

    kiyo_hiko
    kiyo_hiko 2013/05/20
    ExcelVBAからセル内改行を操作する場合vbCrLfじゃなくてvbLfでなっているから注意しよう、という話。Replace(置き換える文字列, 置き換られえパターン, 置き換えパターン)関数で適宜改行を変換する。
  • Office TANAKA - VBAの実行時エラー[オブジェクト変数または With ブロック変数が設定されていません。(エラー番号:91)]

    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

    kiyo_hiko
    kiyo_hiko 2013/05/19
    なるほVBAやっぱしめんどくさい…
  • 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

    kiyo_hiko
    kiyo_hiko 2013/04/04
    Set wsh = CreateObject("WScript.Shell")→wsh.Exec("%ComSpec% /c ...")→StdOut.ReadAllで実行結果をぶんどってStringにできるという。この技よさげ
  • Office TANAKA - Excel VBA Tips[UserFormでツールバーを使う]

    登録できる画像はbmp形式などです。サイズに注意して、ご自分で作成するか、既存のツールバーをキャプチャして使いましょう。ただし、ツールバーのボタン画像にも著作権が発生します。自分だけで使うUserFormなら問題ないですが、第三者に配布するときや販売するときなどには、著作権に十分留意してください。 上図はImaeListを配置したところです。実行時には表示されないコントロールですから、配置する場所はどこでもけっこうです。 ImageListを選択すると、[プロパティ]ウィンドウに[(プロパティページ)]という項目が表示されます。 ここの右端にある[...]ボタンをクリックすると、[プロパティページ]ダイアログボックスが表示されます。 [イメージ]タブを開き、[ピクチャの挿入]ボタンをクリックします。 [図の選択]ダイアログボックスで「open.bmp」を選択して[開く]ボタンをクリックしま

    kiyo_hiko
    kiyo_hiko 2013/02/18
    ExcelのUserFormにツールバー
  • Office TANAKA - Excel VBA Tips[文字列内の文字をカウントする]

    たとえば、ある文字列の中に、任意の文字が存在するかどうかは、InStr関数で判定できます。下のコードは、"ABC,DEF"の中に","が存在するかどうかを判定します。 Sub Sample1() Dim buf As String buf = "ABC,DEF" If InStr(buf, ",") > 0 Then MsgBox "存在します" Else MsgBox "存在しません" End If End Sub InStr関数は、検索する文字列(ここでは",")が何文字目に存在するかを返しますので、InStr関数の結果が0より大きいときは、存在するということです。もし、検索する文字列が複数存在した場合、InStr関数は最初に見つかった位置を数値で返します。 Sub Sample2() Dim buf As String, n As Long buf = "ABC,DEF,GHI" n

    kiyo_hiko
    kiyo_hiko 2013/02/14
    InStrが、部分文字列を見つけた位置を返すのを利用してループするらしい。あとの2つは発想が手続きっぽくなくておもしろかった
  • 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

    kiyo_hiko
    kiyo_hiko 2013/02/06
    参照設定に「Microsoft Forms 2.0 Object Library」、でDataObjectを使う。自分の目的ならもう一つの方ではなくDataObjectで十分ね
  • Office TANAKA - Excel VBA Tips[ワークシートをスクロールする]

    アクティブセルを移動するのは、Range(アドレス).SelectとかRange(アドレス).Activateのように簡単ですね。移動先のセルが現在のウィンドウ上に表示されていれば、ただアクティブセルが移動するだけですし、移動先がウィンドウに表示されていない場合はワークシートが自動的にスクロールします。こうしたワークシートのスクロールを制御するコマンドもVBAに用意されています。 ワークシートをスクロールさせるときは、一般にスクロールバーを使います。スクロールバーは操作する場所によって、スクロールする量が異なります。スクロールバーは次のようなパーツで構成されています。 昔は、スクロールバーの両端にあるボタンに正式名称はなかったのですが、最近のExcelヘルプなどでは「上向き矢印」「左向き矢印」などと呼んでいるようです。 ワークシートを行単位または列単位でスクロールするには、Windowオブ

    kiyo_hiko
    kiyo_hiko 2012/12/12
    この記事はとても参考になった
  • Excel VBAでのテキストファイル操作を操作する

    稿で紹介する「テキストファイルの操作」は、Shift-JIS形式のテキストファイルを対象にしています。UTF-8形式のファイルを扱うときは、下記ページをご覧ください。 UTF-8形式のテキストファイルから読み込む UTF-8形式のテキストファイルに書き込む ファイル操作の最後に、テキストファイルへの読み書きテクニックをご紹介します。VBAでマクロを作成していると、たまにテキストファイルへデータを書き込むと便利なケースに遭遇します。たとえば、現在の設定を保存して後で利用したり、ユーザーが行った操作のログを残したり・・・。テキストファイルの操作は Excelのシートやセルの操作とは異なり、どちらかというとVisual Basic的なテクニックです。詳細に解説しているマニュアルも少ないかもしれません。ここでは、テキストファイルからデータを読み込むときのセオリーや、テキストファイルにデータを書

    kiyo_hiko
    kiyo_hiko 2011/08/10
    ファイルIOの話。ExcelやAccessのVBAは会社で時々必要になるんだけど、もうほとんど忘れてるので困る。復習したいし、VBAはこのサイトが一番参考になるけど、そもそもマイExcel持ってないしなあ。
  • 1