私が購読しているPC誌で「表計算大会」なるものが開催されて私も応募しましたが、今回初めて「マクロ」部門も開催されました、この大会の教祖様適存在の「田中某氏」が氏主宰のSNS上にて「マクロ中級」なるものの大会を開いているので応募したわけです。
2問あって
Q1はある特定フォルダ内に「現在の日付」(yyyymmdd.xls)という名前で保存するのだが同じファイル名がすでにある場合は末尾に(1)という風に連番で保存するという問題。今日が「20070226」なら
..20070226.xls
..20070226(1).xls
..20070226(2).xls
..20070226(n).xls
という具合、なにやら良からぬ仕掛けがあるらしいが自分が素直に考えて作ったのがこれです。
Sub Q1()
f_name1 = "C:Work" & Format(Now, "yyyymmdd") & ".xls"
If Dir(f_name1) = "" Then
ThisWorkbook.SaveAs Filename:=f_name1
Exit Sub
End If
i = 1
Do
f_name2 = "C:Work" & Format(Now, "yyyymmdd") & "(" & i & ").xl
s"
If Dir(f_name2) = "" Then
ThisWorkbook.SaveAs Filename:=f_name2
Exit Sub
End If
i = i + 1
Loop
End Sub
Q2は社員番号に「+2」をするというもの
考えたのがこれです。
Sub Q2()
With Application
.ScreenUpdating = False
With Range("A1")
For h = 1 To .CurrentRegion.Rows.Count
For i = 1 To Len(.Offset(h, 1))
If Mid(.Offset(h, 1), i, 1) <10 Then
抽出 = Right(.Offset(h, 1), Len(.Offset(h, 1)) + 1 - i
)
長さ = Len(Right(.Offset(h, 1), Len(.Offset(h, 1)) + 1
- i))
.Offset(h, 3).Value = Left(.Offset(h, 1), Len(.Offset(h, 1)) - 長さ) & 抽出 + 2
End If
Next i
Next h
End With
.ScreenUpdating = True
End With
End Sub
でも良く見ると「D5」の桁が増えています、末尾の数字だけを処理するとこうなります、実はこれを作る前にも失敗作がありました、数列だけを抽出して処理した場合数列の頭が「0」で始まっていると桁が詰まってしまう現象で悩みました、悩んだ末に出来たのが以下のやつです。
Sub Q2()
With Range("A1")
For n = 1 To .CurrentRegion.Rows.Count
文字列長 = Len(.Offset(n, 1))
For h = 1 To 文字列長
文字種 = Mid(.Offset(n, 1), h, 1)
If 文字種
「D7」は桁上げができるかを試すために加えた行だがうまく出来ています、ポイントは数列の桁数を保存しておくことと末尾の数字が「8」と「9」の場合は桁が上がるのでその分を考慮することです、でもこれが分かったのは応募した後でした。
でもでもこれでもまだだめで例えば「ABC88」なんていう内容だと「ABC090」になって余計な「0」が付加されてしまうのです、そして考えたのが以下。
Sub Q2()
With Range("A1")
For n = 1 To .CurrentRegion.Rows.Count
文字列長 = Len(.Offset(n, 1))
For h = 1 To 文字列長
文字種 = Mid(.Offset(n, 1), h, 1)
If 文字種 <= 9 Then
数字 = Right(.Offset(n, 1), 文字列長 - h + 1)
文字列 = Left(.Offset(n, 1), 文字列長 - Len(数字))
表示数字 = Right(String(文字列長, "0") & 数字 + 2, Len(数字) + 1)
If Left(表示数字, 1) = "0" Then
表示数字 = Right(String(文字列長, "0") & 数字 + 2, Len(数字))
End If
.Offset(n, 3).Value = 文字列 & 表示数字
Exit For
End If
Next
Next
End With
End Sub
変数「表示数字」の頭が"0"だったら桁上げではみ出した"0"を無視することにしました。
2問あって
Q1はある特定フォルダ内に「現在の日付」(yyyymmdd.xls)という名前で保存するのだが同じファイル名がすでにある場合は末尾に(1)という風に連番で保存するという問題。今日が「20070226」なら
..20070226.xls
..20070226(1).xls
..20070226(2).xls
..20070226(n).xls
という具合、なにやら良からぬ仕掛けがあるらしいが自分が素直に考えて作ったのがこれです。
Sub Q1()
f_name1 = "C:Work" & Format(Now, "yyyymmdd") & ".xls"
If Dir(f_name1) = "" Then
ThisWorkbook.SaveAs Filename:=f_name1
Exit Sub
End If
i = 1
Do
f_name2 = "C:Work" & Format(Now, "yyyymmdd") & "(" & i & ").xl
s"
If Dir(f_name2) = "" Then
ThisWorkbook.SaveAs Filename:=f_name2
Exit Sub
End If
i = i + 1
Loop
End Sub
Q2は社員番号に「+2」をするというもの
考えたのがこれです。
Sub Q2()
With Application
.ScreenUpdating = False
With Range("A1")
For h = 1 To .CurrentRegion.Rows.Count
For i = 1 To Len(.Offset(h, 1))
If Mid(.Offset(h, 1), i, 1) <10 Then
抽出 = Right(.Offset(h, 1), Len(.Offset(h, 1)) + 1 - i
)
長さ = Len(Right(.Offset(h, 1), Len(.Offset(h, 1)) + 1
- i))
.Offset(h, 3).Value = Left(.Offset(h, 1), Len(.Offset(h, 1)) - 長さ) & 抽出 + 2
End If
Next i
Next h
End With
.ScreenUpdating = True
End With
End Sub
でも良く見ると「D5」の桁が増えています、末尾の数字だけを処理するとこうなります、実はこれを作る前にも失敗作がありました、数列だけを抽出して処理した場合数列の頭が「0」で始まっていると桁が詰まってしまう現象で悩みました、悩んだ末に出来たのが以下のやつです。
Sub Q2()
With Range("A1")
For n = 1 To .CurrentRegion.Rows.Count
文字列長 = Len(.Offset(n, 1))
For h = 1 To 文字列長
文字種 = Mid(.Offset(n, 1), h, 1)
If 文字種
「D7」は桁上げができるかを試すために加えた行だがうまく出来ています、ポイントは数列の桁数を保存しておくことと末尾の数字が「8」と「9」の場合は桁が上がるのでその分を考慮することです、でもこれが分かったのは応募した後でした。
でもでもこれでもまだだめで例えば「ABC88」なんていう内容だと「ABC090」になって余計な「0」が付加されてしまうのです、そして考えたのが以下。
Sub Q2()
With Range("A1")
For n = 1 To .CurrentRegion.Rows.Count
文字列長 = Len(.Offset(n, 1))
For h = 1 To 文字列長
文字種 = Mid(.Offset(n, 1), h, 1)
If 文字種 <= 9 Then
数字 = Right(.Offset(n, 1), 文字列長 - h + 1)
文字列 = Left(.Offset(n, 1), 文字列長 - Len(数字))
表示数字 = Right(String(文字列長, "0") & 数字 + 2, Len(数字) + 1)
If Left(表示数字, 1) = "0" Then
表示数字 = Right(String(文字列長, "0") & 数字 + 2, Len(数字))
End If
.Offset(n, 3).Value = 文字列 & 表示数字
Exit For
End If
Next
Next
End With
End Sub
変数「表示数字」の頭が"0"だったら桁上げではみ出した"0"を無視することにしました。