VBA 100本ノックNo6~10
#VBA100本ノック 6本目
— エクセルの神髄 (@yamaoka_ss) 2020年10月24日
画像のようにA1から始まる表があります。
D列にB列×C列の計算式を入れてください。
ただし商品コードに"-"の枝番が付いている場合は計算式を入れずそのままにしてください。
例.D2にはB2×C2の計算式を入れる。D4:D5には計算式を入れない。 pic.twitter.com/6Q8reO8A39
Sub ノック6本目() Dim ws As Worksheet: Set ws = Worksheets("Sheet6") Dim i As Long For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row If ws.Cells(i, 1).Value Like "*-*" Then ws.Cells(i, 4).Value = "" Else ws.Cells(i, 4).Formula = "=B" & i & " * C" & i End If Next End Sub
#VBA100本ノック 7本目
— エクセルの神髄 (@yamaoka_ss) 2020年10月25日
A列は文字列データ(表示形式が文字列)で日付が入っています。
日付とみなされる場合はB列に月末日付をmmddの形式で出力してください。
日付け以外の場合は空欄にしてください。
例.B2は「0930」と出力する。
※何をもって日付とみなすかも含めて考えてください。 pic.twitter.com/Y9hNfWJe3N
Sub ノック7本目() Dim ws As Worksheet: Set ws = Worksheets("Sheet7") Dim i As Long For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row Dim stDate As String stDate = ws.Cells(i, 1).Value If IsDate(stDate) Then Dim dDate As Date dDate = DateValue(stDate) ws.Cells(i, 2).NumberFormatLocal = "mmdd" ws.Cells(i, 2).Value = DateSerial(Year(dDate), Month(dDate) + 1, 1) - 1 End If Next End Sub
#VBA100本ノック 8本目
— エクセルの神髄 (@yamaoka_ss) 2020年10月26日
「成績表」シートに5教科の成績表があります。
以下の2条件を満たした者が合格となります。
・5教科合計が350点以上
・全ての科目が50点以上
G列に、合格者に対しては「合格」と出力し、不合格は空欄にしてください。 pic.twitter.com/xchRpTzVvs
Sub ノック8本目() Dim arr As Variant: arr = Worksheets("成績表").Range("a1").CurrentRegion Dim i As Long, j As Long, Goukei() As Long For i = 2 To UBound(arr, 1) ReDim Goukei(0) For j = 2 To 6 If arr(i, j) >= 50 Then Goukei(0) = Goukei(0) + arr(i, j) End If Next If Goukei(0) >= 350 Then Worksheets("成績表").Cells(i, 7).Value = "合" End If Next End Sub
#VBA100本ノック 9本目
— エクセルの神髄 (@yamaoka_ss) 2020年10月27日
「成績表」シートに5教科の成績とG列に合否判定があります。
「合格者」シートを新規作成し、合格者の氏名だけをA列に列挙してください。
※点数は非公開なので「合格者」シートには間違っても出力しないでください。
※何度でも実行できるようにしてください。 pic.twitter.com/TzOaMaQGBv
Sub ノック9本目() Dim ws As Worksheet For Each ws In Worksheets If ws.Name = "合格者" Then Call Pass(ws) Exit Sub End If Next ws Dim newws As Worksheet: Set newws = Worksheets.Add newws.Name = "合格者" Call Pass(newws) End Sub Sub Pass(ws As Worksheet) Dim cnt As Long, i As Long Dim arr1() As String ReDim arr1(1 To 1) As String With Worksheets("成績表") For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row If .Cells(i, 7).Value = "合" Then cnt = cnt + 1 ReDim Preserve arr1(1 To cnt) arr1(cnt) = .Cells(i, 1).Value End If Next End With ws.Cells(1, 1).Value = "合格者名" Dim j As Long For j = 1 To UBound(arr1) ws.Cells(j + 1, 1).Value = arr1(j) Next End Sub
#VBA100本ノック 10本目
— エクセルの神髄 (@yamaoka_ss) 2020年10月28日
画像のように「受注」シートに今月の受注データがあります。
受注数が空欄かつ備考欄に「削除」または「不要」の文字が含まれている行を削除してください。
行の削除は行全体を削除してください。
サンプルでは5行目と10行目を削除
※シートは任意 pic.twitter.com/SIAlWkOFB2
Sub ノック10本目() Dim ws As Worksheet: Set ws = Worksheets("受注") Dim i As Long For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row If ws.Cells(i, 4).Value Like "*削除*" Or ws.Cells(i, 4).Value Like "*不要*" Then ws.Rows(i).Delete Next End Sub
振り返りと反省
所要時間2時間30分… 想定より結構かかってしまった…
- ワイルドカードLike
- NumberFormatLocal
- 新規ワークシートの指定
ここら辺に手間取ってしまい、いろいろ調べながら解決。
NumberFormatLocalを使うところを最初Format関数で処理しようとしてうまくいかなかった。ここら辺のニュアンスの違いはしっかりと理解したい(´・ω・`)
Likeはだいぶ使い方がなじんだので、今後使っていきたい。