さわやかに

Pythonのことだったり子供のことだったり

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 変数について

f:id:kinakobanana:20211023234418p:plain

変数のデフォルト値(初期値)

忘れがちな変数の型とデフォルト値を備忘録。

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」)
f:id:h_267_sunny:20200331222520j:plain

乳児の二重への移行過程

f:id:h_267_sunny:20191217181459j:image

子どもが産まれるとちょっとした事でも気になって検索魔になっちゃいますよね。

わたしは子どもができて、結構気になっていたのが「一重か二重か?」問題。

産まれてすぐって割とみんな一重なんです、徐々に二重になる子はなっていく模様。

一重でも健康でいてくれさえすれば全然いいのですが、もしなるとしたらどのような過程でなるのだろう?

二重になる過程を写真付きでブログに載せている方がいて、大変参考になったので私も記録を残しておこうと思います。

 

 

【生後1日】

もちろん一重。むくみで目の上がパンパンです。

f:id:h_267_sunny:20191214212738j:image

【生後10日】

写真では分かりづらいですが、目の上がスッキリしました。

f:id:h_267_sunny:20191214213431j:image

ただ、寝起きや眠たい時は一瞬だけガッツリ二重でした。

何人?って思うほどバッキバキの目でした。

f:id:h_267_sunny:20191214213809j:image

 

【生後1ヶ月0日】

右目の目尻にだけ線が入りました。左目は一重です。

f:id:h_267_sunny:20191214222726j:image

 

【生後1ヶ月10日】

右目は目尻じゃなくて上の方にうっすら線が入りました。

左目は変わらず一重です。

f:id:h_267_sunny:20191214222740j:image

 

【生後1ヶ月20日

右目は線だけじゃなく折り目がついてきました。

左目は1ヶ月目の右目の時と同様、目尻にだけ奥二重のような線がつきました。

(変な顔をしています笑)

f:id:h_267_sunny:20191214222748j:image

 

【生後2ヶ月0日】

右目は完全に定着。10日前から一重に戻った日は1日もありませんでした。

左目は目尻半分だけ二重に。

f:id:h_267_sunny:20191214220709j:image

 

【生後2ヶ月10日】

右目は二重のまま。

左目は一重に戻ったり目尻にだけ線が入ったり、日によってまちまちでした。

この日、写真のように上の方に線が入りました。

しかし、次の日には一重に戻り...まだまだ定着していません。

f:id:h_267_sunny:20191214222813j:image

 

【生後3ヶ月0日】

右目は並行二重だったのが末広二重に。

(末広二重とは、目頭の幅が狭く目尻に向けて幅が広くなっていく二重)

左目も二重になる日が増えました。

今日まで1週間ずっと二重なのでついに定着したのだと思います。

f:id:h_267_sunny:20200109124505j:image

 

ということで、娘は生後3ヶ月で二重になりました。

 

他の方のブログ等を見ていると、生後1年くらいまでには定着するようですね。

 

私の兄弟は生後1ヶ月で二重になっていたそうなので、

タイミングは本当に人それぞれです。

 

とは言っても、赤ちゃんの顔は成長と共に変わっていくので、これからも楽しみながら様子を観察していきます。

ChuChu紙パック用乳首使ってみた

f:id:h_267_sunny:20191225235218j:image

アカチャンホンポで独占先行発売された「ChuChu 紙パック用 乳首」を使ってみました。

akachan.omni7.jp

 

哺乳瓶要らずで紙パックのままミルクをあげることができます。

なんて画期的!と思って早速買いに走りました。

 

部品を組み立てて、、、

f:id:h_267_sunny:20191218105323j:image

f:id:h_267_sunny:20191218105245j:image

耳を起こして紙パックに刺すだけ!

f:id:h_267_sunny:20191218110713j:image

f:id:h_267_sunny:20191218110458j:image

ほんの数秒で素早くミルクがあげられます!

 

普段の流れは、

 ①粉ミルクを測って哺乳瓶に入れる

 ②哺乳瓶に適量のお湯を入れる

 ③流水で冷やす←意外と時間かかる

子供が泣いているときは1秒でも早くミルクをあげたいと思います。

この手間がいらないなんて、本当にありがたいです。

 

 

うちの娘は、普段「すこやかM1」を飲んでいて、

「アイクレオ」を飲むのは初めてです。

万が一アレルギーが出ても大丈夫なように平日の昼間に試しました!

 

【注意点】

・乳首は初回使用前に洗浄!

  (電子レンジ、薬液、煮沸どれでも消毒OK)

・液体ミルクは開封前によく振る!

 

【値段】

・アイクレオ(125ml)… 200円

・液体ミルク用乳首…    500円

液体ミルクの賞味期限は2020.4で4ヶ月ほど持ちます。しかも常温保管可です。

乳首は繰り返し使えるので決して高い買い物じゃないと思います。

 

【使用感】

ChuChuはスリムタイプ乳首なので、キャップの根元まで咥える形になりました。

いつものPigeonと違って細いので飲み初めは戸惑っているように見えました。

f:id:h_267_sunny:20191217212838j:image

半分くらい順調に飲みましたが、上手く出てこなくなったのか怒りだしました。

 

わたしがミルクを最初に振り忘れていたからかな?(娘ごめんね)

 

一回乳首と紙パックを外して少し振り、乳首の先を掃除して仕切り直し。

125ml飲み切りました。

f:id:h_267_sunny:20191217213332j:image

 

紙パックの形状的に飲み残しが多いかもと気にしていましたが、全然でした!

ちょびっと。

f:id:h_267_sunny:20191218105847j:image

 

清潔に持ち歩けるノズルカバーがついているので、外出時にももってこいです。

 

私は現在、7割母乳・3割ミルクの混合であげています。

外出の際、母乳だけで大丈夫だけど足りなかった時のために、、、と

①ミルク、②哺乳瓶、③お湯を入れた水筒を持って出かけていました。

必ず飲むわけじゃないミルクのために荷物が増えるのを煩わしく感じていました。

これから液体ミルクと乳首を活用すれば荷物がすっきりします。

 

初の液体ミルクを与えてから24時間経過しましたがアイクレオにもアレルギー反応は全く出なかったので問題なしです。

あとは1本200円の出費を理解しながら賢く使っていくことですね!

ベビー クリスマスコスチューム(ワンピース)作ってみた

今日はクリスマスですねー。

何か作りたい欲が出てきて娘のワンピースをつくりました。

完成品こちら!

f:id:h_267_sunny:20191225212439j:image 

"まるっきりサンタ!"みたいなのじゃなくてさりげなくクリスマスらしさのある服を

と思い、ボルドー色のシンプルなものにしました。

ガンダムばりのいかり肩です、

かわいい!

ちなみにサンタ帽は百均です。

 

 

こちらのYouTube動画を参考にさせて戴きました。


100均でできる!手ぬぐいチュニック

これはチュニックの作り方ですが、我が子はまだ小さいのでこれワンピースとして

作れるんじゃないかと。

サイズは適当ですのでお子さんに合わせながら作ってみてください。

 

【材料】

ベロア生地(ボルドー)

平ゴム

ミシン糸

f:id:h_267_sunny:20191217103833j:image

【作り方】

1.生地を裁断

① 30cm×24cm   1枚

② 40cm×40cm   2枚

f:id:h_267_sunny:20191217140800j:imagef:id:h_267_sunny:20191217140804j:image

2.「…」線をほつれないようにザグザグ縫い(②は2枚とも)

「--」線は真ん中を半分に切る

f:id:h_267_sunny:20191217143841j:image

 

3.①の長辺の片側を1cmずつ2回折りしてから縫う

f:id:h_267_sunny:20191217144506j:image

4.②の2枚を中表にして上を15cm空けて両側「...」線を縫う

f:id:h_267_sunny:20191217145207j:image

5.15cm残した部分を1cm外折りし、コの字型に縫う(反対側も)

f:id:h_267_sunny:20191217163223j:image

6.裾を1cm 2回外折りし、全周縫う

f:id:h_267_sunny:20191217164334j:image

6.外表にして①と②を縫い合わせる

 ①は1cm折ってから縫う

 ①は長辺を縫った側が下になるようにしてください

 輪になるように4箇所同様に縫う

f:id:h_267_sunny:20191217164931j:image

こうなります

f:id:h_267_sunny:20191217171715j:image

7.内表にして、1cmの後2cmの外折り

 ゴム通しを3cmほど残して全周縫う

f:id:h_267_sunny:20191217175951j:image

8.ゴムを通して程よく絞る

 空けておいた3cmを縫って完成!

f:id:h_267_sunny:20191217180351j:image

 

 

まあまあな出来です。

 

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

以上です。