投稿

5月, 2022の投稿を表示しています

VBA記事14.検索上手になる

ここまで習得出来たらなら基本的な事はほぼマスターし、簡単な処理なら難なく処理できるはずですが、 VBA の全体量は膨大であり、本ブログで伝えきれない事は山ほどあります。 たとえば WorkSheetFunction では VLOOKUP も使えますので、ご興味のあるかたは調べてみてください。 その際 google などで「 VBA WorkSheetFunction.VLOOKUP 」などと検索すると日本語のサイトが多数出てきます。 また逆に「 VBA 数を数える」などで検索すると WorkSheetFunction の CountIf のページが出てくると思います。( CountIf に頼らないほかの方法も出てきます。) 他にも、自分が実現したい機能をすでに誰かが実現していて、そのコードを公開している場合も多々あります。例えば「 VBA シート 目次」などで検索すると、そのコードが出てきます。 選択しているセルの番地(A1)などを MsgBox に出力したり、 InputBox を利用すれば、変数を手打ちで簡単に変更できます。 VBA には本当に便利な機能が多数あります。 ここまで読んできた人なら基本的な文章は読めるようになっているのでネットの検索や書籍を見ても理解できると思われます。 また、会社内でも処理したいファイルをコピーして、マクロを組んで狙った処理が出来るかを試してみてください。 そして狙った処理が出来たなら、上司に相談して仕事が出来るやつと思われても良いですし、マクロの処理で効率化出来た時間に好きなことをすることも出来ます。 はじめは不安かもしれませんが、ネットや書籍を調べながらでもポンコツな私は狙った処理が出来、社内でかなり評価されています。 また、ネットで学習する際は、「VBA 学習サイト」で検索するといくつかのサイトが出てきますので、自分に合うサイトを探すのも一つだと思います。 検索上手になり、コードの意味をしっかり吸収していけば自ずとレベルアップしていきます。

VBA記事13. WorkSheetFunction.Countif

イメージ
************************************** Sub sample11() Dim x As Long Dim y As Long Dim Tantou As String Tantou = Range("F1") x = Application.WorksheetFunction.Match("* 担当者 *", Rows(1), False) y = Application.WorksheetFunction.CountIf(Columns(x), Tantou) MsgBox Tantou & " さんは " & y & " 件、訪問してます " End Sub ************************************** Match と CountIf では、()内の並びが異なるので注意してください。 String は文字列を意味していますが、 String の代わりに variant でも大丈夫です。 上記のコードではまずxに担当者の列を格納し(今回は5)、そして、 CountIf で5行目の Tantou の件数を数えています。 変数が多くなると混乱するかもしれませんが、多数の複雑な処理を行うには変数をたくさん使いますので、必ず、理解していってください。

VBA記事12.エラー回避

イメージ
前述の Match で何某かの値が取得できないとエラーになります。 上記の図のケースだと「備考」の文字がないためエラーになってしまっています。 これは2通りのエラー回避方法で回避できます。 ************************************** Sub sample11_1() Dim x As Long On Error Resume Next X = Aplicatin.WorksheetFunction.Match(“ 備考” , Rows(1), False) Range(Cells(1,x) , Cells(1, x + 3)).EntireColum.Delete End sub ************************************** エラーの原因となる行の上に On Error Resume Next と書くことでエラー画面を出すことなく処理させる子が可能ですが、情報量が多い Excel のファイルだとうまく処理できたかわからなくなる時があります。 このため、エラーの時にメッセージが出るように下記のようにラベル処理を併用します。 ************************************** Sub sample11_1() Dim x As Long On Error GoTo Laber001 X = Aplicatin.WorksheetFunction.Match(“ 備考” , Rows(1), False) Range(Cells(1,x) , Cells(1, x + 3)).EntireColum.Delete MsgBox “ 備考から右3列を削除しました” Exit Sub Label001: MsgBox “ 備考が見つかりませんでした” End sub ************************************** まずは正しく処理されたときに、その旨を伝えるメッセージが出るようにします。 つ...

VBA記事11. WorkSheetFunction.Match

イメージ
上記の表を用意してください。 ************************************** Sub sample11_1() Dim x As Long X = Aplicatin.WorksheetFunction.Match(“ 備考” , Rows(1), False) Debug.Print x Range(Cells(1,x) , Cells(1, x + 3)).EntireColum.Delete End sub ************************************** 下の図のように書いて実行すると、備考欄から右側が消えているのがわかります。 これは備考欄から右の3つを消す処理になっています。 また備考欄は 6 列目にあるので、xには6が入っており、イミディエイトウィンドウにも6が出力されているはずです。 Match のカッコ内は(検出文字、検出範囲、 False )になります。

VBA記事10. 列の削除 と ワイルドカードの使用

イメージ
まず、上記のファイルを用意します。 ************************************** Sun sample11() Dim i As Long For i = 10 To 2 Step -1 ‘流動的に対応するなら Cells(Rows.Count ,1).End(xlUp).Row To 2 Step -1 と書く If Cells(I,2) Like “ 削除*” Then Rows(i).Delete End if Next End Sub ************************************** そして上記のコードを書いて実行すると図の左のようになります。 注意点としては For がいつもの処理と違って逆流していることです。 逆流させずに処理すると5と6のように連続していた場合、うまく消えません。 これはステップインで処理を見てもわかるのですが、 逆流しない処理だと、 i が5で5行目が消された瞬間に、6が5行目に来ます。 そして次に i が6になったときに 6 行目には7が来ているので、 6 行目が処理されなくなるという事が起こるのです(処理ターゲットの列がズレてしまう) 文章だとわかりづらい可能性もあるので、是非シートを複数コピーして、ステップインで動きを1コマずつ見れば何が起こっているか直感的に理解できます。 この列がズレるのを防ぐために For を逆流させて下の行から削除していく事で、処理漏れを防いでいます。 メカニズムはよくわからかった人でも行や列の削除には逆流処理を行うと覚えておけば OK です。 またワイルドカードのアスタリスク(*)を使用するために Like を使用しています。 このとき=は不必要になり、削除の文字がセルの頭についていれば拾えるようになります。  *削除*にすれば削除を含んだ文字を拾えるようになります。