ExcelVBA セルの検索(Findメソッド)とオートフィルタ(AutoFilter)
Findメソッド
セル範囲.Find(What:=検索値, _ After:=検索開始セル, _ LookIn:=値か数式かコメントか, _ LookAt:=完全一致か部分一致か, _ SearchOrder:=行方向か列方向か, _ SearchDirection:=順方向か逆方向か, _ MatchCase:=大文字と小文字を区別するか, _ MatchByte:=全角と半角を区別するか, _ searchFormat:=書式を条件に含めるかどうか)
必ず指定しなければならない引数は「What」のみ
指定した方がいい引数は「LookAt」
【LookAt引数】
定数 | 意味 |
---|---|
xlWhole | 完全一致 |
xlPart | 部分一致 |
Findメソッドの戻り値はRange型なのでSetが必要
セルが見つからなかった場合はNothingを返す
Dim myRng as Range Set myRng = Range("A1:A5").Find(What:="佐藤", LookAt:=xlWhole)
AutoFilter
セル.AutoFilter Field:=列番号, _ Criteria1:=絞込み条件1, _ Operator:=演算子, _ Criteria2:=絞り込み条件2
引数の名前を省略することで可読性が高まる
Range("A1").AutoFilter 3, "佐藤", xlOr, "佐々木"
「○より大きい」などの比較演算子での絞込みが可能
Range("A1").AutoFilter 4, ">=300", xlAnd, "<=700"
3つ以上の条件を指定する場合は配列形式で絞込みが可能
Operator引数にはxlFilterValuesを指定する
次のコードは、佐藤または佐々木または鈴木で絞り込む
Dim arry(2) as String arry(0) = "佐藤" arry(1) = "佐々木" arry(2) = "鈴木" Range("A1").AutoFilter 3, arry, xlFilterValues
AutoFilterで絞り込んだ件数をカウントする
Dim num As Long Range("A1").AutoFilter 3, "佐藤" num = WorksheetFunction.SubTotal(3, Range("A:A")) - 1 '見出し行を-1する MsgBox "件数は" & num &"件です。"
AutoFilterで絞込み、表示されているセルのみ編集
次のコードは表示されているD列に1000を代入する
Range("A1").AutoFilter 3, "佐藤" Range(Range("D2"), Cells(Rows.Count, 4).End(xlUp)) = 1000 Range("A1").AutoFilter 3 ' AutoFilterの絞込み解除
ExcelVBAからWorksheet関数を呼び出す
VBAからワークシート関数を呼び出すことが出来る
(Applicationは省略可)
Application.WorksheetFunction.関数名(引数)
1. SUM関数
WorksheetFunction.Sum(セル範囲) WorksheetFunction.Sum(Range("A1:A5")) '例
2. COUNTIF関数
WorksheetFunction.CountIf(セル範囲, 条件) WorksheetFunction.CountIf(Range("A1:A5"), "佐藤")) '例
3. SUMIF関数
WorksheetFunction.SumIf(条件範囲, 条件, 合計範囲) WorksheetFunction.SumIf(Range("A1:A5"), "佐藤", Range("B1:B5")) '例
4. LARGE関数/SMALL関数
WorksheetFunction.Large(セル範囲, 順位) WorksheetFunction.Small(セル範囲, 順位) WorksheetFunction.Large(Range("A1:A5"), 3) '例:3番目に大きいセルの値 WorksheetFunction.Small(Range("A1:A5"), 3) '例:3番目に小さいセルの値
5. MAX/MIN関数
WorksheetFunction.Max(セル範囲) WorksheetFunction.Min(セル範囲) WorksheetFunction.Max(Range("A1:A5")) '例 WorksheetFunction.Min(Range("A1:A5")) '例
6. SUBTOTAL関数
WorksheetFunction.SubTotal(計算方法,セル範囲) WorksheetFunction.SubTotal(3, Range("A1:A5")) '例:COUNTA
【第一引数の計算方法】
1 | AVERAGE |
2 | COUNT |
3 | COUNTA |
AutoFilterで抽出した結果をカウントするにはSUBTOTAL関数を使用する
7. EOMONTH関数
WorksheetFunction.EoMonth(開始日, 月) WorksheetFunction.EoMonth(Now(), 0) '例:今月末 WorksheetFunction.EoMonth(Now(), -1) '例:先月末 WorksheetFunction.EoMonth(Now(), 1) '例:来月末
8. VLOOKUP関数
WorkseetFunction.VLookup(検索値, セル範囲, 列, 完全一致or部分一致) WorksheetFunction.VLookup("佐藤", Range("A1:D5"), 3, False) '例:Falseは完全一致
9. MATCH関数
セル範囲の上から何番目かを返す
WorksheetFunction.Match(検索値, セル範囲, 照合の種類) WorksheetFunction.Match("佐藤", Range("A1:A5"), 0) '例
10. INDEX関数
セル範囲の行番号の位置にあるセルの値を返す
WorksheetFunction.Index(セル範囲, 行番号) WokrsheetFunction.Index(Range("A1:A5"), 3) '例
VLOOKUP関数と同様の動きをするもの
VLOOKUP関数は実務での使用頻度が高いです。
(1) VLOOKUP関数
WorksheetFunction.VLookup(Range("D1"), Range("A1:B10"), 2, False)
(2) MATCH関数 + INDEX関数
検索値より左側にある値を取得したい場合は、MATCH関数とINDEX関数を組み合わせて使う。
Dim num as Long num = WorksheetFunction.Match(Range("D1"), Range("A1:A10"), 0) Index(Range("B1:B10"), num)
(3) Findメソッド + Offsetプロパティ
VBAのメソッドやプロパティだけで再現するとFindメソッドとOffsetプロパティを使う。
Dim myRng as Range Set myRng = Range("A1:A10").Find(What:=Range("D1"), LookAt:=xlWhole) myRng.Offset(0, 1).Value
ExcelVBA 変数について
変数のデフォルト値(初期値)
忘れがちな変数の型とデフォルト値を備忘録。
型 | TypeName | 意味 | Default名 |
---|---|---|---|
整数型 | Integer | -32,768から32,767の整数 | 0 |
長整数型 | Long | Integerより広範囲の整数 | 0 |
文字列型 | String | 文字列 | "" |
バリアント型 | Variant | すべて | Empty |
ブール型 | Boolean | TrueかFalse | False |
オブジェクト型 | Object | オブジェクト | Nothing |
ワークブック型 | Workbook | ExcelBook | Nothing |
ワークシート型 | Worksheet | Excelシート | Nothing |
セル型 | Range | セルまたはセル範囲 | Nothing |
日付型 | Date | 日付 | 00:00:00 |
変数の宣言
変数の宣言方法と宣言した変数の使用できる範囲
Public > Private > Dim
パブリック変数 モジュール変数 ローカル変数
名前 | その変数が使用できる範囲 | 宣言場所 |
---|---|---|
Public | すべてのモジュール | 宣言セクションのみ |
Private | 該当のモジュール全体 | 宣言セクションのみ |
Dim | 宣言セクションでの宣言:該当のモジュール全体 プロシージャ内での宣言:プロシージャ内のみ |
宣言セクション or プロシージャ内 |
マクロの最小実行単位であるプロシージャとは、「Sub マクロ名」で始まり「End Sub」で終わる範囲を言う。
(返り値がある場合は「Function マクロ名」~「End Function」)
乳児の二重への移行過程
子どもが産まれるとちょっとした事でも気になって検索魔になっちゃいますよね。
わたしは子どもができて、結構気になっていたのが「一重か二重か?」問題。
産まれてすぐって割とみんな一重なんです、徐々に二重になる子はなっていく模様。
一重でも健康でいてくれさえすれば全然いいのですが、もしなるとしたらどのような過程でなるのだろう?
二重になる過程を写真付きでブログに載せている方がいて、大変参考になったので私も記録を残しておこうと思います。
【生後1日】
もちろん一重。むくみで目の上がパンパンです。
【生後10日】
写真では分かりづらいですが、目の上がスッキリしました。
ただ、寝起きや眠たい時は一瞬だけガッツリ二重でした。
何人?って思うほどバッキバキの目でした。
【生後1ヶ月0日】
右目の目尻にだけ線が入りました。左目は一重です。
【生後1ヶ月10日】
右目は目尻じゃなくて上の方にうっすら線が入りました。
左目は変わらず一重です。
【生後1ヶ月20日】
右目は線だけじゃなく折り目がついてきました。
左目は1ヶ月目の右目の時と同様、目尻にだけ奥二重のような線がつきました。
(変な顔をしています笑)
【生後2ヶ月0日】
右目は完全に定着。10日前から一重に戻った日は1日もありませんでした。
左目は目尻半分だけ二重に。
【生後2ヶ月10日】
右目は二重のまま。
左目は一重に戻ったり目尻にだけ線が入ったり、日によってまちまちでした。
この日、写真のように上の方に線が入りました。
しかし、次の日には一重に戻り...まだまだ定着していません。
【生後3ヶ月0日】
右目は並行二重だったのが末広二重に。
(末広二重とは、目頭の幅が狭く目尻に向けて幅が広くなっていく二重)
左目も二重になる日が増えました。
今日まで1週間ずっと二重なのでついに定着したのだと思います。
ということで、娘は生後3ヶ月で二重になりました。
他の方のブログ等を見ていると、生後1年くらいまでには定着するようですね。
私の兄弟は生後1ヶ月で二重になっていたそうなので、
タイミングは本当に人それぞれです。
とは言っても、赤ちゃんの顔は成長と共に変わっていくので、これからも楽しみながら様子を観察していきます。
ChuChu紙パック用乳首使ってみた
アカチャンホンポで独占先行発売された「ChuChu 紙パック用 乳首」を使ってみました。
哺乳瓶要らずで紙パックのままミルクをあげることができます。
なんて画期的!と思って早速買いに走りました。
部品を組み立てて、、、
耳を起こして紙パックに刺すだけ!
ほんの数秒で素早くミルクがあげられます!
普段の流れは、
①粉ミルクを測って哺乳瓶に入れる
②哺乳瓶に適量のお湯を入れる
③流水で冷やす←意外と時間かかる
子供が泣いているときは1秒でも早くミルクをあげたいと思います。
この手間がいらないなんて、本当にありがたいです。
うちの娘は、普段「すこやかM1」を飲んでいて、
「アイクレオ」を飲むのは初めてです。
万が一アレルギーが出ても大丈夫なように平日の昼間に試しました!
【注意点】
・乳首は初回使用前に洗浄!
(電子レンジ、薬液、煮沸どれでも消毒OK)
・液体ミルクは開封前によく振る!
【値段】
・アイクレオ(125ml)… 200円
・液体ミルク用乳首… 500円
液体ミルクの賞味期限は2020.4で4ヶ月ほど持ちます。しかも常温保管可です。
乳首は繰り返し使えるので決して高い買い物じゃないと思います。
【使用感】
ChuChuはスリムタイプ乳首なので、キャップの根元まで咥える形になりました。
いつものPigeonと違って細いので飲み初めは戸惑っているように見えました。
半分くらい順調に飲みましたが、上手く出てこなくなったのか怒りだしました。
わたしがミルクを最初に振り忘れていたからかな?(娘ごめんね)
一回乳首と紙パックを外して少し振り、乳首の先を掃除して仕切り直し。
125ml飲み切りました。
紙パックの形状的に飲み残しが多いかもと気にしていましたが、全然でした!
ちょびっと。
清潔に持ち歩けるノズルカバーがついているので、外出時にももってこいです。
私は現在、7割母乳・3割ミルクの混合であげています。
外出の際、母乳だけで大丈夫だけど足りなかった時のために、、、と
①ミルク、②哺乳瓶、③お湯を入れた水筒を持って出かけていました。
必ず飲むわけじゃないミルクのために荷物が増えるのを煩わしく感じていました。
これから液体ミルクと乳首を活用すれば荷物がすっきりします。
初の液体ミルクを与えてから24時間経過しましたがアイクレオにもアレルギー反応は全く出なかったので問題なしです。
あとは1本200円の出費を理解しながら賢く使っていくことですね!
ベビー クリスマスコスチューム(ワンピース)作ってみた
今日はクリスマスですねー。
何か作りたい欲が出てきて娘のワンピースをつくりました。
完成品こちら!
"まるっきりサンタ!"みたいなのじゃなくてさりげなくクリスマスらしさのある服を
と思い、ボルドー色のシンプルなものにしました。
ガンダムばりのいかり肩です、
かわいい!
ちなみにサンタ帽は百均です。
こちらのYouTube動画を参考にさせて戴きました。
これはチュニックの作り方ですが、我が子はまだ小さいのでこれワンピースとして
作れるんじゃないかと。
サイズは適当ですのでお子さんに合わせながら作ってみてください。
【材料】
ベロア生地(ボルドー)
平ゴム
ミシン糸
【作り方】
1.生地を裁断
① 30cm×24cm 1枚
② 40cm×40cm 2枚
2.「…」線をほつれないようにザグザグ縫い(②は2枚とも)
「--」線は真ん中を半分に切る
3.①の長辺の片側を1cmずつ2回折りしてから縫う
4.②の2枚を中表にして上を15cm空けて両側「...」線を縫う
5.15cm残した部分を1cm外折りし、コの字型に縫う(反対側も)
6.裾を1cm 2回外折りし、全周縫う
6.外表にして①と②を縫い合わせる
①は1cm折ってから縫う
①は長辺を縫った側が下になるようにしてください
輪になるように4箇所同様に縫う
こうなります
7.内表にして、1cmの後2cmの外折り
ゴム通しを3cmほど残して全周縫う
8.ゴムを通して程よく絞る
空けておいた3cmを縫って完成!
まあまあな出来です。
Python setdefaultメソッド 要素がない場合のみ追加
setdefaultメソッド
辞書型(dict)に要素(key)が存在しない時のみ要素を追加する。
存在する時は何もせず、エラーを出さない。
dict.setdefault(要素[, 値])
最初にまとめを書いておきます。
- dict[要素] = 値 ・・・要素があれば上書き、なければ要素を追加
- dict[要素] += 値 ・・・要素があれば値をプラス、なければエラー
- dict.setdefault(要素, 値)・・・要素があればスルー、なければ要素を追加
例として、
要素(key)が商品名、値(value)が在庫数のデータを持つ辞書型dictがあるとし、
在庫を増やしたり減らしたり、新商品が入ってきたらdictに要素を追加するモジュール。
'peach'という要素がないのでエラーが発生してしまう。
>>> dict = {'apple' : 5, 'orange' : 1, 'grape' : 10} # 在庫 >>> dict['apple'] += 1 # 'apple'が1つ増えた >>> dict {'apple': 6, 'orange': 1, 'grape': 10} >>> dict['peach'] += 1 # 'peach'が1つ増えた KeyError: 'peach' # 'peach'という要素がないのでエラー
エラーを出さないようにするにはif文にしよう!
>>> dict = {'apple' : 5, 'orange' : 1, 'grape' : 10} # 在庫 >>> if 'peach' in dict: duct['peach'] += 1 # dictに'peach'がある場合は+1 else: dict['peach'] = 1 # dictに'peach'がない場合は新商品として値を1
if分を使わずにもっと簡単な書き方がある。
setdefaultメソッドを使えばエラーが出ず記述できる。
>>> dict = {'apple' : 5, 'orange' : 1, 'grape' : 10} # 在庫 >>> dict.setdefault('apple', 0) # 在庫に'apple'がなければ新商品として値ゼロ >>> dict.['apple'] += 1 # 'apple'の在庫を+1 >>> dict {'apple': 6, 'orange': 1, 'grape': 10, 'peach': 1} >>> dict.setdefault('peach', 0) # 在庫に'peach'がなければ新商品として値ゼロ >>> dict['peach'] += 1 # 'peach'の在庫を+1
以上です。