IT資格取得~受験料の節約~

ITに関する資格についてのブログ

ソースコードの行数をカウントするVBAマクロ

前回に続きVBAに関する記事。

いきなり巨大なZIPファイルを渡され、ソースコードの行数をカウントしてほしいとのオーダーがあった。

いやいやちょっと待て。VS Code Counter使えば一瞬だろと突っ込んだが、何故かやってくれない。ベンダーに聞けばいいじゃんっていえば、ごにょごにょいって対応してくれない。

  • 全てベンダーに丸投げで何もできない
  • ちょっと調べればできることをやらない

こんな社員ばかりだから、DXがいつになっても成功しないのでは!?

コスト感覚も狂っていて、こんなどうでもいいソースコードのカウントをお高いお高いコンサルにお願いしようとする。こりゃコンサルが儲かるわけだわ。その依頼されたコンサルもソースコード書いたことないし、VSCode触ったこともないような人なので、時間がかかる。ソースコードをカウントするだけで、数十万円のコストがチャリーン。

現場では1円、1銭のコストを切り詰めているのに、少し離れたオシャレなオフィスでは、DXの名のもとに

数十万円どーん、数百万円どかーん、数千万円?意外に安いじゃーん

と湯水のようにお金が流れていく。実に不思議なことだ。

って前置きはおいといて、何故かネットにもつながらない、かつ、VSCodeがインストールされていない端末でソースコードをカウントするはめに。(お安い便利屋の宿命)

困ったときはVBAということで、スマホでググりながらソースコードを書くことに。

世の中にジャストフィットするサンプルがなかったので、このブログで紹介することにしました。(必要性があまりないので、当然といえば当然ですが、、、)

 

★注意点★

コメントとか空行とかは1行としてカウントします。真剣にやればできたかもしれませんが、正直めんどくさかったので、何もこだわっていないです。

[ソースコードをカウントするマクロ]

<準備①>

B2にカウントしたい対象の親フォルダのパスを入力。

B4~F4にラベルを入力。以下イメージ。

f:id:mylives2010:20210510141152p:plain

<準備②>

 Alt+F11でマクロの編集画面を開き、ツール→参照設定で、”Microsoft Scripting Runtime"にチェックを入れる。

f:id:mylives2010:20210510141426p:plain

<準備③>

以下のコードを標準モジュールに貼り付ける。

Sub getFileList(searchPath)

Dim fso As New FileSystemObject
Dim objFiles As File
Dim objFolders As Folder
Dim separateNum As Integer
'サブフォルダの取得
For Each objFolders In fso.GetFolder(searchPath).SubFolders
Call getFileList(objFolders.Path)
Next
'ファイル名の取得
For Each objFiles In fso.GetFolder(searchPath).Files
separateNum = InStrRev(objFiles.Path, "\")
'ファイルの情報を書き込む
ActiveCell.Value = Left(objFiles.Path, separateNum - 1)
ActiveCell.Offset(0, 1).Value = Right(objFiles.Path, Len(objFiles.Path) - separateNum)
ActiveCell.Offset(0, 2).Value = FileDateTime(objFiles)
ActiveCell.Offset(0, 3).Value = Format((FileLen(objFiles) / 1024), "#.0") 書式崩れるのでカッコ大文字にしています。ご注意 
'ファイルの行数をカウントする
Dim F_PATH As String
F_PATH = objFiles.Path
Dim fso1 As Scripting.FileSystemObject
Set fso1 = New Scripting.FileSystemObject
Dim ts As Scripting.TextStream
Set ts = fso1.OpenTextFile(Filename:=F_PATH, IOMode:=ForAppending)
ActiveCell.Offset(0, 4) = ts.Line
ts.Close
ActiveCell.Offset(1, 0).Select
Next
End Sub

Sub setFileList(searchPath)
Dim startCell As Range
Dim maxRow As Integer
Dim maxCol As Integer
Set startCell = Cells(5, 2) 'この位置から出力し始める
'シートをいったんクリア
startCell.Select
maxRow = startCell.SpecialCells(xlLastCell).Row
maxCol = startCell.SpecialCells(xlLastCell).Column
Range(startCell, Cells(maxRow, maxCol)).ClearContents
Call getFileList(searchPath)
startCell.Select

End Sub

Sub CommandButton_Click()

Call setFileList(Cells(2, 2))

End Sub

 

 

上記で準備完了。後は、 CommandButton_Clickを実行するだけ。実行結果のイメージは以下。

f:id:mylives2010:20210510142058p:plain

 

彼らはこの実行結果を何に使うのだろうか。。。(´・ω・`)

 

VBAエキスパート公式テキスト Excel VBAベーシック

VBAエキスパート公式テキスト Excel VBAベーシック

  • 作者:田中 亨
  • 発売日: 2019/05/30
  • メディア: 単行本(ソフトカバー)
 

 

VBAを使ってCSVファイルから特定の行を抽出する

大量のCSVファイルと格闘する機会があった。しかも特定の文字列だけを抽出したいとのこと。。こんながっつり作業は久しぶり。力技でやろうかと考えたが、あまりのCSVファイルの数に挫折。自動化を考えることに( ゚Д゚)

CSVのファイルの数は多いが、幸いファイルサイズはさほど大きくなかった。そこでVBAで力技でやることに。ググってもいい感じの情報がサクッと見つからなかったので、将来CSVファイルと格闘する人のためにイケてないソースコードを公開する。

☆注意点☆

CSVのファイルサイズが大きいと動かないので要注意。なぜなら、考えるのがめんどくさく、ファイルオープンしてFINDしているからである。

[CSVファイルから特定の文字列が含まれる行を抽出するマクロ]

<準備1>

新規にxlsmファイルを作成。シートは以下二つを用意。

f:id:mylives2010:20210502001527p:plain

[検索値シート]

C1セルに”検索したいCSVファイル”が格納されているフォルダパスを入力

A列の2行目以降に検索、抽出したい文字列を記載。

サンプルのコードは完全一致。一行変えれば部分一致もできる。

マクロのボタンは、適当に配置。

f:id:mylives2010:20210502002331p:plain

[検索結果シート]

検索、抽出結果が出力されるシート 

一行目のラベル(A~D列)は自分で事前に入力。二行目以降は自動で出力される。

  • A~D列に、どのファイルをどの文字列で検索して、どこにあったかを出力
  • F列以降は、検索対象文字列が含まれる行をそのまま出力

f:id:mylives2010:20210502002733p:plain

上記だと、”test"と"sampleって文字列を検索し、該当する行を抽出している。

検索対象のCSVファイルは以下の感じ。

↓test.csv↓ 

f:id:mylives2010:20210502003903p:plain

<準備2>

以下のコードを貼り付けて、search関数を実行すればおしまい。コメントの場所と改行をいじっているので動かなかったらごめんなさい。

ちなみに拡張子を変えれば、CSVファイルじゃなくてエクセルファイルでも検索、抽出はできる。(想定)

 

↓ここから

 

 

Sub search()

Application.ScreenUpdating = False 'ちらつき防止

Dim targetSheet As Worksheet'検索値があるシート

Dim outputSheet As Worksheet'検索結果を出力するシート

Dim outputSheetRowAddress As Integer ’検索結果を出力するシート
outputSheetRowAddress = 2

Dim searchSheet As Worksheet'対象データがあるシート
Set targetSheet = Worksheets(1)
Set outputSheet = Worksheets(2)

Dim File_Name As String
Dim fl_name As String
Dim DIR_PATH As String
Dim SourcePath As String
Dim Opnbook As Workbook
SourcePath = "C1"'検索元ファイルのPath定義

'検索元データの格納チェック
DIR_PATH = targetSheet.Range(SourcePath).Value
fl_name = Dir(DIR_PATH & "\*.csv*") 'ここ円マークです
If fl_name = "" Then
MsgBox "CSVファイルがありません。"
Exit Sub
End If

'指定フォルダにあるCSVファイルの数だけ検索を実行
Do
Dim sheetCount As Integer
Set Opnbook = Workbooks.Open(DIR_PATH & "\" & fl_name) 'ここ円マークです
sheetCount = Opnbook.Worksheets.Count
If sheetCount = 0 Then
MsgBox "シートがないへんなファイルです" & fl_name
Exit Sub
End If

'シートの数だけ検索を繰り返す。CSVファイルなので基本1つのはず。
For i = 1 To sheetCount
Dim row As Integer'検索値の最終行取得
row = targetSheet.Cells(targetSheet.Rows.Count, 1).End(xlUp).row
For k = 2 To row
Dim foundCell As Range'検索結果のセル
Dim searchCell As Range'検索値のセル
Set searchCell = targetSheet.Cells(k, 1)
If Not searchCell = "" Then'検索値が空白でなければ検索実行
Set foundCell = Opnbook.Worksheets(i).Cells.Find(searchCell, LookAt:=xlWhole, SearchOrder:=xlByColumns)'検索結果取得
If Not foundCell Is Nothing Then'検索値があったら以下実行
Dim FirstCell As Range
Set FirstCell = foundCell

Do
'検索値に一致した行をコピー
Opnbook.Worksheets(i).Rows(foundCell.row).Copy
'検索結果出力シートに張り付け
outputSheet.Rows(outputSheetRowAddress).PasteSpecial (xlPasteAll)

'空のセルを追加するためにA1を選択
outputSheet.Activate
outputSheet.Range("A1").Select

'ファイル名、シート名、行番号を入れるためにセルをずらす
outputSheet.Range(Cells(outputSheetRowAddress, 1), Cells(outputSheetRowAddress, 5)).Insert xlShiftToRight
outputSheet.Cells(outputSheetRowAddress, 1).Value = fl_name
outputSheet.Cells(outputSheetRowAddress, 2).Value = Opnbook.Worksheets(i).Name
outputSheet.Cells(outputSheetRowAddress, 3).Value = foundCell.Address
outputSheet.Cells(outputSheetRowAddress, 4).Value = searchCell.Value

'検索結果出力シートの貼り付け先の行を更新
outputSheetRowAddress = outputSheetRowAddress + 1
'次を検索
Set foundCell = Opnbook.Worksheets(i).Cells.FindNext(foundCell)

'次の検索結果が最初と同じかか存在しなかったら、次の検索処理へ
If foundCell.Address = FirstCell.Address Then
Exit Do
ElseIf foundCell Is Nothing Then
Exit Do
End If
Loop
End If
End If
Next
Next
'開いたファイルを閉じる
Application.DisplayAlerts = False
Opnbook.Close
fl_name = Dir
Loop Until fl_name = ""

'最後に罫線設定をして、オートフィルタ設定しておしまい
tmp = outputSheet.Range("A1").End(xlDown).row
outputSheet.Range("A1:D" & Format(tmp)).Borders.LineStyle = xlContinuous
outputSheet.Range("A2:D" & Format(tmp)).Interior.ColorIndex = 15
If outputSheet.AutoFilterMode = False Then
outputSheet.Range("A1:D1").AutoFilter
End If

End Sub

 

↑ここまで

 

久々にコードを書いて思ったのは、もう現場戻れないな。。。

変数の名前とかめんどくさくて”tmp1"とか"temp3"とか一回動いたら、そのまま放置してしれっとリリースすると思う。

 

Excel VBA 脱初心者のための集中講座

Excel VBA 脱初心者のための集中講座

 

 

先入観・型にはまらない転職活動のススメ

最近、IT系の仕事から少し脱線して、中途採用の仕事に携わる機会があった。

色々新しい発見があったので、紹介する。

その①:転職活動を就活の延長線と思っている人はお祈り率が高い

就活のようにそこそこの学歴があれば数打ちゃ当たると考えている人は改めた方がいい。不採用の確率が高く、時間を無駄に浪費するだけである。特に、

  • 自己紹介、経歴紹介をテンプレート化して使い回すこと

をやっている人は、相当まずいと思ってもらって問題ない。

面接の時間は非常に短い。面接官に”あ、マッチしそうだな”と思わせる必要がある。当たり障りのない自己満的な紹介は不要。”自己紹介、職歴紹介”の中で、面接官に対して、

ここを深掘りしたい、ここの経験を詳しく聞きたい 

と思わせる必要がある。この点に関しては、事前の準備、戦略の組み立てが必須。個人的には、各種紹介の後に面接官から質問がなかった場合、”刺さっていないと同意”であると考えている。

ただし、戦略と言っても難しいことではない。結構簡単なことなのに、やっていない人が多いため、差がついている現状がある。

  1. 応募職種、ポジションの募集背景を自分の言葉で具体的に説明するできるようにする
  2. 自分の経歴、スキル、志向と照らし合わせFitできるもを探す
  3. Fitしたものを具体的な例を持って説明、紹介できるようにする
  • NG例:臨機応変に対応して、課題解決を推進した
  • OK例:OSの構築経験、スキルを踏まえ、課題を可視化し、アプリ担当者を巻き込んで課題解決を推進した。

すごい当たり前なことだ思う人もいるかもしれないが、”この当たり前”ができていない人が本当に多い。

経歴は新しいものから紹介しないとダメだ

短く端的に説明することが大切なため、具体的なプロセスは後で話そう 等々

先入観に囚われ、相手目線が欠落していないかよく考える必要がある。

その②:仕事と転職活動は全く別物と考えている人は残念率が高い

仕事をしている中で、

  • あの上司は全然資料を読んでくれない 
  • 会議資料を事前に送付しているのに目を通してくれない
  • 結局使われるのは、サマリ資料の1枚だけ

って思いをする人はちょこちょこいる想定。なので、自分の仕事を進めるために、創意工夫を凝らしているはずだ。

なのに、何故か転職活動になると、

  • 事前に応募書類は読み込んでもらっているはずだ!
  • ある程度、スキル・経験を書類上の内容は理解している上で質問されているはずだ!

といった、謎の前提を置いている人が多い。

転職の面接となると、面接官として、現場のリーダーやマネージャーが出てくることが多い。自分の上司に照らし合わせてもらえれば一番しっくりくると思うが、

  • 書類を事前に読み込んでくれるだろうか?
  • 質問事項をあらかじめ用意してくれるだろうか?

答えは”NO”である。もちろん、事前に応募書類は読み込むべきである。しかし、残念ながら、リーダークラスは常に120%ぐらい稼働しており、時間が裂けない現実がある。

ってなると、伝える側は丁寧にならざるを得ない。

  • 職務経歴書に書いてある通り〜〜〜です。
  • 志望動機に書いてある通り〜〜です。

って言ったところで、あんま読んでないので”この人何言ってるんだ??”ってなる。特に、職務経歴書は、人によっては10枚近くあったりするので、余計に?????な感じになる。

しかも職務経歴書はなぜか知らないが、ワードのフォーマットて非常に読みづらい。今だに使われている理由が不明。

  • 秘書を通じやっとのことで会議調整ができたリーダー層、経営層への報告の場で、あのワードの形式の報告書を使ってプレゼンしますか?

って質問したら、大体の人が”NO”と答え、”伝えたいことをまとめたサマリ資料を用意する”と答えるはずである。

転職面接の場も同じである。”今回の応募のために作ったサマリ資料”を手持ちしておけば良いだけの話。ただし、サマリを闇雲に出すのではNGである。営業活動を思い出してもらいたい。

  • 聞いてもいないことを資料を出して、喋りだし、押し売りされる

そんなことされたら不信感が募るだけである。出すタイミングが肝要。自然の流れに任せるべき。用意したものが無駄になる可能性があるが、そこはしっかり我慢をする。

仕事で大事な報告をする時、想定質問を考え、手持ち資料、Appendixを何枚も用意したけど、結局使わなかった。ってのはあるあるなこと。逆に、労力(プロセス)をアピールしようとして、聞かれてないことをダラダラ話したら、評価がよくなかった。ってのもあるあるなこと。

転職活動も全く同じである。

 

私個人の考えであるが、転職活動は仕事の延長線上である。売り上げを上げる、契約を勝ち取るためには、戦略が不可欠。転職活動も戦略が不可欠。

戦略が立てられない場合は、応募しない方がいい。相手は百戦錬磨の手だれ。すぐにボロが出てNGとなる。お互い時間がもったいない。

転職活動は、楽しみながらゲーム感覚でできる人もいれば、事情があって追い込まれながらやっている人もいる。後者の場合、精神的にも肉体的にも非常に辛いことが多々ある。そんな人に少しでも役に立てればと、、、、、

 

成功する転職面接 成否の9割は「準備」の質で決まる

成功する転職面接 成否の9割は「準備」の質で決まる

  • 作者:末永 雄大
  • 発売日: 2020/06/17
  • メディア: 単行本(ソフトカバー)