失敗談

50円単位で切り上げる(失敗談)

かつて(10年以上前に)、このような相談を受けたことがある。 Excelで、金額を50円単位で切り上げたい。 例えば、34円を切り上げて50円にしたい。 しかし、十の位を切り上げれば100円に、一の位を切り上げれば40円と なって、50円には届かない。さて、どう…

配列からの値貼り付けに関する覚書 ② 値と数式の混在は成立しない場合がある(失敗談)

先日体験した失敗談からのご紹介。 例えば、こんなテーブルでのお話。 納期は基本的に、発注日の14日後だ。 ところが、このテーブルの使用者から、こんな要望が寄せられた。 果物によっては、納期が変わる場合があって、納期のセルを上書きしたい。 上書き…

配列からの値貼り付けに関する覚書 ① Transpose関数とIndex関数は極力使用しない

ここ一週間ほど、(私にとっての)大規模マクロを作成していて、泥沼に はまっている(絶賛継続中)。そこから抜け出そうとして得た教訓を一つ二つ、覚書として残しておこう。 例えば、こんなテーブル。 これについて「品名列をF2~F4に転記したい」とする。…

失敗談の失敗再現を失敗していた話(失敗談)

以前、失敗談としてこんな話を書いた。 Transpose関数には、行列入れ替えの上限があるらしい、という話だ。 infoment.hatenablog.comところがよくよく調べてみると、失敗談として紹介したかった内容を、 正しく再現できていないことに気づいた(偶然)。当時…

クラスモジュール:ArrayEditの改修

当ブログで公開しているクラスモジュール:ArrayEditに不具合が見つかった。 使っている方は殆ど居ないと思っているが、念のためお知らせしておく。 対象となるのは、↓ で公開中のArrayEditに含まれるCompareResultArrayメソッド。 infoment.hatenablog.com…

配列のある操作に関する限界(失敗談)

今日も、私の失敗談を一つ紹介。 このブログで何度か紹介している、こちらのクラスモジュール。 infoment.hatenablog.comこの中には、二つの配列を比較してその結果を配列として返す関数がある。 例えば、こちら二つの表を比較したい場合。 Sub Test() Dim a…

結局、お茶を濁して終わらせた話(失敗談)

今日は結局、お茶を濁して終わらせたお話。 こちらのブログでも紹介した、ユーザー定義関数「FindAll」。 少し前に、これが誤動作することが分かった。もともと、指定したキーワードがシート状に複数ある場合、そのキーワードを含むセル全てをRangeで返す仕…

不連続な範囲を選択(失敗談)

不連続な範囲を、お手軽に選択したくなった。 例えば、A1とC3を選択したい場合。 その場合、このような書き方が可能だ。 ちなみに、↓ こう書くと、 Range("A1","C3").Select これは選択範囲の左上と右下を指しており、この間の全セルが選択されてしまう…

配列になってなかった(失敗談)

今回は、配列にまつわる失敗談。 例えば、こんな名簿があるとする。 この「名前」の部分を一旦配列に格納して、処理したいと考えた。 Sub Test() ' テーブルを変数に格納。 Dim Tb As Excel.ListObject Set Tb = ActiveSheet.ListObjects(1) ' 名前の列を配…

初めて仕事で書いたマクロ(失敗談)

「仕事で初めてマクロを書いたときのことを覚えていますか?」 というご質問をいただいた。そこで、一番古い記憶を辿ってみた。 「初めて」か否かは、定かでない。ただ、一番古い記憶がこちらだと思う。 数値を小数点第三位に四捨五入して、テキストファイル…

テーブルのデータを消すときの注意点(失敗談)

テーブルのデータを消そうとして、失敗した時のお話。 先日から登場している、このテーブルを例に説明する。 このデータを綺麗に消したい時、一番手っ取り早いのは、例えばこんなやり方だ。 Sub test() ActiveSheet.ListObjects(1).DataBodyRange.Delete End…

宣言と同時にNewでは、Initializeは働かない(失敗談)

とあるクラスモジュール(Class1)を作成した。 エッセンスだけ書くと、こんな感じだ。 Private Sub Class_Initialize() MsgBox "!" End Sub そして標準モジュールにおいて、つい鈍らして、宣言と同時にNewしてしまった。 Sub test() Dim Class As New VBAPr…

インスタンスを破棄するタイミング(失敗談)

大変な勘違いをしていた。 サブプロシージャ内で生成されたインスタンスは、 サブプロシージャ終了時に、自動的に破棄される。 従って最近個人的に流行りの下記も、 With New Class1 てっきり、サブプロシージャ終了時に破棄されるものと思い込んでいた。 し…

変数宣言に関する勘違い(大失敗談)

変数は、同一プロシージャ内で複数回宣言するとエラーになる。しかしこのようにループ(繰り返し処理)の中で宣言すると、エラーにならない。 Sub Test() Dim i As Long For i = 1 To 10 Dim j As Long Next End Sub また、変数は宣言直後は、変数の型毎に定…

ある文字の時にイベント発生(失敗談)

昨日のこと。メールで、こんな依頼が舞い込んできた。 A1の値がA(りんご)になったとき、イベントを発生させたい。 了解、やりましょう。 確認したところ、A1にはリストが設定されていた。 ここで「A(りんご)」を選んだ時に、何某かの処理を行いた…

青 + 黄 = 緑色?(失敗談)

セルやフォントに着色する際、手っ取り早く「色定数(ColorConstants)」で指定する方法がある。 例えばセルを赤で塗りつぶしたい場合、本来なら Selection.Interior.Color = 255 となるところ、Excelが準備してくれている定数を用いることで、このような記…

「フリガナ」の欄に入力 の続き2(失敗談)

先日は、様々な書式でよく見かける「フリガナ」欄の入力方法を考えてみた。 infoment.hatenablog.com今日は、これの続きを少しだけご紹介。 VBAでフリガナを取得する場合、方法は次の二つ。 WorkSheet関数を、VBAで使用。 ApplicationオブジェクトのGetPhone…

配列に日付を格納して、オーバーフローしたお話(失敗談)

先日、このような表を受け取った。 A列には、何が入っているのだろう?一つ選択してみると、8桁の数字が入ってい た。セルの幅が狭すぎて、このような表示になったようだ。 ※書類のレイアウト上、この列のために広い幅を確保できないとのこと。 システムか…

マクロでIFERRORを使ってみる(失敗談)

例えば、こんな値が並んでいるとする。 数字の各値に10を加えて右隣に表示したいのだが、数字以外の値に10を加えれば、エラーになってしまう。 こんな時は、IFERROR関数を用いると便利だ。 support.office.com平たく言うと、「エラーだったら、何表示します…

シート上でjoin関数っぽく振舞うユーザー定義関数(失敗談)

先日は、シート上でsplit関数っぽく振舞うユーザー定義関数を作ってみた。 infoment.hatenablog.comそれなりに面白かったので、今度は調子に乗って、シート上でjoin関数っぽく振舞うユーザー定義関数を作ってみた。 考え方は前回と同じ。選択範囲について各…

判定後の再計算でおかしな結果に(失敗談)

Excel VBA初級者向けの勉強会で、 繰り返し 条件分岐 を同時に扱うことになった。そこで、まずこのような表を作成。 数値には、RANDBETWEEN関数を用いており、各セルに1から10までの数がランダムに表示されている。参加者には以下を入力し、結果を確認し…

NotesメールをExcel VBAで自動作成したときの宛先文字数制限(失敗談)

今から4年ほど前のこと。勤め先の、とある定例業務は ↓ こんな感じだった。 Excel の書類に仕様値を入力。 書類を管理する番号で、1.を名前を付けて保存。 別部門の担当者へ、2.を添付してメール送信。 1~3は、毎回ほぼ決まり切った内容であるため、…

ラーメンクラス(失敗談)

Excel VBAの勉強会で、クラスモジュールが話題が上がった。ついでに、Enumの使い方・使い処が良く判らないという意見もあった。 そこで、「少し脱線するけど・・・」という前置きと共に、こんなクラスモジュールを作ってみた。 クラスモジュール(ラーメン)…

テーブルにレコードを追加するときの注意点 ① 失敗談から抜粋

Excelのテーブル機能が、とても便利だ。抽象的な表現ではあるが、この機能は空気を読んで、色々と良い感じに編集してくれる。だが、時にはそれが仇となる場合もある。 例えば、こんな表があるとする。 この表は既に、テーブルとして書式設定されている。 こ…

何でもなさそうなところで、エラーで止まってしまう(失敗談)

今日は、短め。先日、あるマクロがエラー終了するようになってしまった。 今までは、正常に動いていたのに。それでよくよく調べてみると、エラーで止まった個所が問題ではなく、ある行の次で止まっていることが分かった。 On Error Resume Next エラーがあっ…

ゴールシークとマクロ ① 無限遠からのアプローチ(2)

先日は、複数の解を持つ関数についてゴールシークを行う場合、限りなく大きな値から探しに行くことを検討してみた。 infoment.hatenablog.com 結果、消費税のように単純な計算式の場合、「10の30乗」という大きな値からのアプローチでも、一瞬で計算できるこ…

一旦配列に格納したのちに処理したときの失敗談

例えばある列に、8桁の整数が入力されているとする。 これらは年月を表しており、年4桁+月2桁+日2桁となっている(yyyymmdd)。これをDate型に切り替えるために、以下のようなマクロを作成した。 Sub test() Dim myRng As Range Set myRng = ActiveShe…

今日は、今月の第何週目?

指定日が、指定月の第何週目かを知る必要があった。 そこで、Excel のユーザー定義関数で求めてみることにした。 今日は、2月27日。なので今日の日付を引数として、戻り値は、何週目かを表す数値にしよう。 色々な方法があると思うが、私はこう考えた。 …

テーブルのフィルターボタン(失敗談)

テーブルとして書式設定を行うと、自動でフィルターボタンが付される。 これがラベルの文字と重なって、同文字を見え難くすることがよくある。 これは、フィルターボタンのチェックを外すことで、非表示化が可能だ。 CSVから取り込んだデータをテーブルと…

ピボットテーブルのバージョンを指定しないとどうなる?(失敗談)

定期的に、ピボットテーブルをマクロで作成したくなることがある。そこで試しにマクロの記録で作ってみて、少し整理すると、このような記述になる。 Sub Test() Dim Tb As ListObject Set Tb = ActiveSheet.ListObjects(1) Dim Sh As Worksheet Sheets.Add S…