VBA100本ノックチャレンジ:71~80本目
2021年9月頃にやってたんだけどNoteの記事にしていなかった分です。
71本目。
#VBA100本ノック 71本目
— エクセルの神髄 (@yamaoka_ss) January 20, 2021
アクティブシートには「グラフ1」があります。
ブックと同一フォルダにprezen1.pptxがあり、1スライド目に「図1」のオブジェクトがあります。
「図1」を「グラフ1」に差し替えてください。
縦横比維持して元の「図1」の大きさの範囲に収めてください。 pic.twitter.com/BWVWdkhFFI
自分の回答はこちら。
VBA100本ノック71本目
— Yuzunoki (@y_ibris) September 23, 2021
ググると神髄さんのサイトが出てくるので、カンニングはいかんとppxの参照設定だけして自動メンバ表示のプロパティやメソッドのみググって頑張りました
あとグラフを図として貼ればいいのかグラフとして貼ればいいのか分からなかったけど、公式回答だと図として貼ってたっぽい pic.twitter.com/3oWFLCpnXf
パワポの操作はほとんどしたことがないけど、WinActorのライブラリをいじっているときにちらっとググったのをうっすら覚えていたのが意外と役に立った。
72本目。
#VBA100本ノック 72本目
— エクセルの神髄 (@yamaoka_ss) January 22, 2021
引数の文字列に以下の処理を行い文字列で返すFunctionを作成。
全ての"IT"を"DX"に置換
※大小文字全半角問わず
※直前または直後がアルファベットの場合は対象外
※空白及び'は除いて判定
置換する:"IT","と IT","itは","IT 99"
しない:"GIT","site","It's","it is" pic.twitter.com/SSM2eE2pKq
自分の回答はこちら。
VBA100本ノック72本目。
— Yuzunoki (@y_ibris) September 25, 2021
もう分からんのでとりあえず動く状態にして回答見よ!の気持ち
そういえばSelectCaseでCase "A" to "Z"とかもできるんでしたね いつも失念してしまう
正規表現版は書いてあるのを解読はできても自分で書けるようにならないので身についてないな…っていう悔しい思い pic.twitter.com/8luEliNfn1
コメントでも書いているけれどSelect CaseにCase A to Zが使えるだとか、Mid関数で置き換えができるだとか、もっと簡単にやれる方法はたくさんあるので知っておいて使い分けするのは大事だと思う。
73本目。
#VBA100本ノック 73本目
— エクセルの神髄 (@yamaoka_ss) January 23, 2021
新規ブックを作成し、先頭シートにフォームコントロールのボタンを作成します。
・Captionは「テスト」
・登録するマクロはThisWorkbookのプロシージャー「test」
・位置および大きさは任意
新規ブックはThisWorkbookと同一フォルダにxlsxで保存。 pic.twitter.com/BiUyS98PVk
自分の回答はこちら。
VBA100本ノック73本目。
— Yuzunoki (@y_ibris) September 25, 2021
一瞬「新規作成したブックのThisworkbookモジュールに記述したマクロを登録…?…VBE操作!?」とビビりかけましたがそういうことではなかった
非表示メンバの表示方法は初めて知りました なるほどね(表示>オブジェクトブラウザ上で右クリック>非表示メンバを表示) pic.twitter.com/YId7zomQGO
ボタン追加してマクロ登録するの、実は最近業務で使いました。
74本目。
#VBA100本ノック 74本目
— エクセルの神髄 (@yamaoka_ss) January 25, 2021
「売上」シートには、A列B列に取引先コードと名称があり、その下に見出し行から始まるデータがあります。
「DB」シートにデータベース形式で出力してください。
見出し行は文字列も含め統一されています。
取引先ごとの行数は不定です。
※「DB」は既存で見出しも書式も設定済 pic.twitter.com/XADxlzAqLk
自分の回答はこちら。
VBA100本ノック74本目
— Yuzunoki (@y_ibris) September 25, 2021
スクショ1枚に収まらなくなってきた
なるべく一発で貼りたいので配列にまとめてDBシートにぺたーしましたが、売上シートのフォーマット変更にはちょっと弱いかも pic.twitter.com/Ju73cekqBI
これは本当に実業務でよく使う…。ニンゲンフレンドリーでデータベースになっていないデータって山ほどありますよね。山ほど。
75本目。
#VBA100本ノック 75本目
— エクセルの神髄 (@yamaoka_ss) January 26, 2021
ブックを開いたら「ログイン」フォームを表示しIDとパスワードを入力してもらうVBAを作成します。
IDとパスワードは「ID」シートに登録されています。
IDまたはパスワードを3回間違ったらブックを閉じてください。
正しく入力されたら「ログイン」フォームを閉じてください。 pic.twitter.com/NMhUYNFx5F
自分の回答はこちら。
VBA100本ノック75本目
— Yuzunoki (@y_ibris) September 25, 2021
ごく普通というかなんというか
ブックを閉じる処理の時にいっつもApplication.Quitを考慮するの忘れてしまうんですよね 凹み
フォームモジュール内のPublicプロシージャがFormオブジェクトのプロパティとして呼び出せるの、考えればそうなんですけど気づきませんでした 成程 pic.twitter.com/yicBwqhKsc
Excelフォームはちょくちょく使う機会があるんですが、内部のデザインにいつも四苦八苦します。融通を利かせやすくする、なかなか難しい…。
76本目。
#VBA100本ノック 76本目
— エクセルの神髄 (@yamaoka_ss) January 27, 2021
フォームコントロールのボタンに登録するSubを作成。
ボタン表示文字を判定し下記パターン位置へ移動します。
・シート名!セル番地 → シートのセルへ
・シート名 → シートへ
・名前定義 → ブック範囲の名前定義へ
※名前定義よりシート名を優先
移動先なしはメッセージ表示 pic.twitter.com/9FuYtEDl34
自分の回答はこちら。
VBA100本ノック76本目
— Yuzunoki (@y_ibris) September 26, 2021
Application.Callerはググってみて初めて知りました
そして動きはするけど公式回答はやっぱりスマートだなくそー!の気持ち
Application.Gotoが便利とも言う
あと例にはないがボタン名にセル番地のみが指定された場合も考慮した方がいいのかと思ったけどそこまでではなかった様子 pic.twitter.com/DfPvDwoEII
「いろんなやりかた(アプローチ)がある」というものに対して、自分の記述はどうなのかなって思っちゃいますね。改善の余地を見つけるのも自分だけだと難しい。この記述もどうなんだろう?
そういう場があるなら、なるべく他人に見てもらったり意見交換した方が断然いいなと思います。
77本目。
#VBA100本ノック 77本目
— エクセルの神髄 (@yamaoka_ss) January 29, 2021
シートが挿入された場合、その新規シートに対して以下の処理を行う。
・ブック内の最終シート(一番後ろ)に移動する
・シート名は当日の「yyyymmdd」とする
・既に同一シート名が存在する場合は挿入したシートは削除
※常に一番後ろにシートが挿入され当日の名前になる。
自分の回答はこちら。
VBA100本ノック77本目
— Yuzunoki (@y_ibris) September 26, 2021
可もなく不可もなし
NewSheetイベントは使ったことなかったけど見て「これだろう」と分かるのは良いこと
自分で書くときもこれくらい分かりやすいプロシージャ名にしたいところだけど難しい pic.twitter.com/ds9IAO5VQE
イベントはあまり使う機会がないかも。これくらいシンプルならいいけれど、ユーザーの操作を制御するのってどうしたらいいか本当に悩ましい。
78本目。
#VBA100本ノック 78本目
— エクセルの神髄 (@yamaoka_ss) January 30, 2021
シートには複数のグラフがあります。
シートの全グラフのデータの範囲を一括で変更します。
データ範囲の下に追加された行をグラフのデータ範囲に追加してください。
※画像では2021/01を追加(B1:C10をB1:C11)します。
※シートは任意 pic.twitter.com/k8OjZYBFFv
自分の回答はこちら。
VBA100本ノック78本目
— Yuzunoki (@y_ibris) September 26, 2021
できる限り自動メンバから予測したかったけどChartObjects.Chartで詰んだのでググりました SeriesCollection…存じ上げない方でした…
シート名にカンマが入ってた時の対応した方がいいのかと思ってシート名抜きにして抽出した対象範囲を置き換え debug.printは消し忘れです… pic.twitter.com/5RPSUxJwF7
最近(2022年5月時点)はLIKE演算子を意識して選択するようになってきたので、ここの書き方も少し変わりそう。でもグラフ操作する機会は相変わらずそんなにないな…
79本目。
#VBA100本ノック 79本目
— エクセルの神髄 (@yamaoka_ss) February 1, 2021
ブックと同一フォルダにdoc1.docxがあります。
ブックマーク「エクセル表」の位置から、
・ブック名
・シート名
・A1セルからの表をリンクしない図で貼り付け
同一フォルダに「doc1_yyyymmdd.docx」で保存してWord終了してください。
※完成は画像を参照
※シートは任意 pic.twitter.com/9XvfGXLEM5
自分の回答はこちら。
VBA100本ノック79本目
— Yuzunoki (@y_ibris) September 26, 2021
Wordは何とも扱いにくい 次の行をどう選択するか?でSelection.MoveDownにしましたけど、改行コード含めて貼るのも確かにその通り ところで正式回答では何故vbVerticalTabを…?
あとSelection.TextとSelection.TypeTextの使い分けがまだちょっと掴み切れなかったです pic.twitter.com/2b21coNcW3
会議資料でWord使うので、あんまりないけどたまに複数ファイル一気に操作したいこともあるんですよね。Wordの知識ないと把握しきれないこともあるので手間取る。
80本目。
#VBA100本ノック 80本目
— エクセルの神髄 (@yamaoka_ss) February 2, 2021
このブックは変更してほしくないので、以下の動作にしたい。
・開かれたら読み取り専用に設定
・上書き保存や名前を付けて保存をしようとしたら、保存せずに強制的にブックを閉じる
・閉じる時の保存確認メッセージも出さない
※VBA作成中は気を付けて!
自分の回答はこちら。
VBA100本ノック80本目
— Yuzunoki (@y_ibris) September 26, 2021
※不完全なやつ!※
苦し紛れにこうしたものの、よく考えればAppication.EnabledEvents=falseにするプロシージャ作っとけばいいというのはその通り。気づけなかった悔しい。あと保存せずに閉じようとしたときのためにBeforeCloseイベントも作っておくべきでした。二重に悔しい。 pic.twitter.com/hItBlfCIV2
こういう制御イベントは本当に難しい!公式回答はシンプルだけど、それに辿り着くのに色んなことを考えないといけない。
■80本目を終えて。
終えたのは去年の9月なので感想としてはズレますが、こここうしたらいいんじゃない?と自分の回答見て思うところもあるので、半年とちょっとで成長してる部分もある!と前向きにとらえたいです。
ただまあ相変わらず一人開発で人の目を介さないので、成長の方向性があっているかどうか…。引き続き頑張りたいところ。