2つのウィンドウの伸び縮みができるバーが登場するのだが、
別にウィンドウがぴったり合ってなくていいので、
このバーを表示しないように設定したいが、結論としてできなかった。
ググったところ、設定できるらしいが…
自分の設定画面にはその項目が存在しなかった。
2つのウィンドウの伸び縮みができるバーが登場するのだが、
別にウィンドウがぴったり合ってなくていいので、
このバーを表示しないように設定したいが、結論としてできなかった。
ググったところ、設定できるらしいが…
自分の設定画面にはその項目が存在しなかった。
マネックスのオンラインでの説明に抜け漏れがあり、説明が尽くされていない。
フローチャートでの説明は不可能なんだろうか。
「わからなかったら電話して」よりも問い合わせコストが下がって顧客満足度が上がると思う。
テキストを読み解くよりも、フローチャートを読み解くほうが難しいと考えられているのだろうか。
既存のNISA口座をマネックスに移管したく説明を読んでいるのだが、
つみたてNISAを申込む ←→ マネックス証券への金融機関変更について
でループしてしまう。
勘定廃止通知書はすでに入手しており、ここをクリアできれば完了できる。
https://info.monex.co.jp/nisa/procedure.html#tomonex
https://info.monex.co.jp/nisa/tsumitate/apply.html
シートAからシートBに転記するVBAを作成した。
業務としては勤怠表がExcel管理で、(1)日々の勤怠をファイルAに、(2)毎月の勤怠をファイルAの記述をもとに別フォーマットのファイルBに記載していた。
(2)ではファイルAの勤怠表に記載した時間を、時間と分に分解してそれぞれセルに記載しないといけない。(ファイルAの8:30をファイルBでは8と30で入力)
サブリーダーとリーダーの方がチェックする時間と、自分が入力する時間が本当に無駄な時間だと思っていた。
根本的な問題としてExcel管理が時代遅れ過ぎているのだけど、解決すべくようやく時間に余裕ができたので作成した。
■時間がかかった点
普段使用している言語は Java や JavaScript で、ロジック組むようなVBAはまず作成してこなかった。
そんな状況の私が大変だったのは、
1. 時間 → 文字列変換
2. 例外処理
1に関してはライブラリないのかと調べたり、
2に関してはエラーが起きても直列に処理されてしまうので、exit subを使えばいいと理解するまで時間がかかってしまった。
'勤怠表を報告書にそのまま貼り付けられる形に編集する
Sub edit Work Time()
On Error GoTo myError
'末尾行を取得する
Dim lastRow As Integer
lastRow getLastRow()
'実績末尾行を取得する
Dim midRow As Integer
midRow = getMidRow()
Dim workTimeArray(30) As Variant
Dim outerIndex As Integer '動的配列にしたいが、時間がないので月内最大日数で準備する
outerIndex=0
'■転記元シートから実績1を取得する
Dim workResults1 As Range
Set workResultsl = Range(Worksheets(2).Cells(36), Worksheets(2).Cells(midRow, 6))
Dim workResult As Range
Dim workResultString As String
Dim workTime As Variant
'実績を配列に格納する
For Each workResult In workResults1
workResultString = convertTimeToString(workResult.Value)
'実績1の時間を時分に分ける
workTime.Split(workResultString,":")
'二次元配列に格納する
workTimeArray(outerIndex)= workTime
outerIndex =outerIndex + 1
Next
'■転記元シートから実績2を取得する
Dim work Results2 As Range
Set work Results2 = Range(Worksheets(2).Cells(midRow + 1, 12), Worksheets(2).Cells(lastRow, 12))
'実績2を配列に格納する
For Each workResult In workResults2
'実績2の時間を時分に分ける
workResultString =convertTimeToString(workResult.Value)
Dim workTime2 As Variant
workTime2 = Split(workResultString,";")
'二次元配列に格納する
workTimeArray(outerIndex) = workTime2
outerIndex= outerIndex + 1
Next
'インデックスのインクリメントで末尾のみ不要なのでその分を減算する
outerIndex= outerIndex -1
'転記先シートに配列の値を代入する
Dim dayCount As Integer
day Count=0
'氏名を取得する
Dim name As String
name =Worksheets(1).Range("F12").Value
'氏名行を取得する
Dim nameRange As Range
Set nameRange = Worksheets("転記先").Range("A14: A200")
Dim nameCell As Range
Set nameCell = nameRange.Find(What: name, _
LookIn:=xlValues, _
LookAt:=x/Part, _
SearchOrder:=xlByColumns, _
SearchDirection:=xINext, _
MatchCase: False, _
MatchByte:=False)
Din nameRow As Integer
nameRow = nameCell.Row
'ループが及ばない可能性があるセルをクリアする
Worksheets(転記先).Cells(nameRow, 32).ClearContents
Worksheets(転記先).Cells(nameRow+1, 32).ClearContents
Worksheets(転記先).Cells(nameRow, 33).ClearContents
Worksheets(転記先).Cells(nameRow+1, 33).ClearContents
Worksheets(転記先).Cells(nameRow, 34).ClearContents
Worksheets(転記先).Cells(nameRow+1, 34).ClearContents
For dayCount = 0 To outerIndex
'値をクリア
Worksheets(転記先).Cells(nameRow, dayCount + 4).ClearContents
Worksheets(転記先).Cells(nameRow + 1, dayCount+4).ClearContents
'配列要素数が3以外ならスキップ(時分秒に分割できなかった場合)
If Not UBound(workTime) - LBound(workTime) +1=3 Then
GoTo Continue
End If
'時分=0:00 ならスキップ
If workTimeArray(dayCount)(0) = 0 And workTimeArray(dayCount)(1) ="00" Then
GoTo Continue
End If
'1行目転記
Worksheets(転記先).Cells(nameRow, dayCount+4).Value workTimeArray(dayCount)(0)
'2行目転記
Worksheets(転記先).Cells(nameRow+1, dayCount + 4).Value = workTimeArray(dayCount)(1)
Continue:
Next
MsgBox "整形されました。"& vbCrLf & "転記先シートを確認してください。"
Worksheets(転記先).Select
Cells(nameRow, 4).Select
Exit Sub
myError:
Select Case Err.Number
Case 91
MsgBox "完全一致する氏名がありませんでした。 " & vbCrLf & "処理を終了します。" & vbCrLf & Err.Description, vbExclamation
Case 13
MsgBox "時間の形式が不正です。" & vbCrLf & "処理を終了します。" & vbCrLf & Err.Description, vbExclamation
Case Else
MsgBox "予期せぬエラーが発生しました", vbExclamation
End Select
End Sub
'末尾行を取得
Public Function getLastRow()
Dim lastRow As Integer
lastRow = Worksheets(2).Range("A3").End(xIDown).Row
getLastRow = lastRow
End Function
'実績末尾行を取得
Public Function getMidRow()
Dim midRow As Integer
midRow Worksheets(2).Range("I3").End(xIDown).Row-1
getMidRow= midRow
End Function
'時間 → 文字列变换
Public Function convertTimeToString(ByVal time)
'値を日付型に変換する
dateDate= CDate(time)
'値を文字列型に変換する
dateString= CStr(dateDate)
convertTimeToString = dateString
End Function
■所感
VBAは進化していない言語だが、その原因は広く使われすぎたことで、既存のスクリプトの後方互換性を保証できなくなっていることなのかなーと思った。
いろんなレベルの人が使っている状況で(しかもプログラミングの素養がなかったりググったりできない人が99.99%くらいだったら)、VBAのバージョンを上げて動かなくなった場合、その問い合わせにいちいち回答していられないよねとは思う。
作ったサービスが広く使われたいが、広く(いろんな層に)使われれば使われるほど、その人たちへのフォローのコストがかさむ。
スーパーのアプリみたいにITリテラシーが低い人が使うアプリの評価って軒並み低いので、訴求対象はわかってる人に限定したいかな。
■余談
作成して2日後に勤怠管理をシステムに移行するということが聞こえてきて、もっと早く言ってよという気持ちでいっぱいになった。
当初の無駄な時間を削減するという目標は達成されることは喜ばしいです。
全角英数に切り替えるショートカットをなくす。
下記項目の「英数切替」を
「-」にする
site:目的のサイトURL "キーワード" after:日付