①と②の順序が入れ替わった時、自動で②を①に、①を②に変更したい。

突然、強烈に面倒くさくなった。
何が面倒くさいって、番号を一々入れ替えるのが。
f:id:Infoment:20191012135043p:plain

私の書く週報は、良し悪しはさておき、こんな書式になっている。
f:id:Infoment:20191012135150p:plain

例えば時系列の関係などから、①と②を入れ替えたとする。
f:id:Infoment:20191012135702p:plain

②と①の文字が自動で入れ替わるはずもなく、次いで手作業で修正が必要になる。
f:id:Infoment:20191012135822p:plain

これが、とても面倒くさい。

そこで、極めて限定的ではあるが、これが自動で入れ替わる関数を作成してみた。
限定的とした理由は、以下の制約があるから。

  1. ① ~ ⑳ のみ対応
  2. 数字は全て、同じ列になければならない
  3. 数字以外の文字が含まれてはならない。

作戦としては、こうだ。

  1. 一つ上の数字について、その文字コードを取得する。
  2. 取得した文字コードに1を加え、文字に変換して返す。

①は、パソコンの中では「-30912」という数字で管理されている。
②は、-30192 + 1 = -30191 といった具合。

これらを踏まえると実際は、こんな感じだ。

Function GetNextNumber(target_range As Range) As String
    Application.Volatile
    If target_range.Row = 1 Then
        GetNextNumber = "①"
    Else
        Dim BeforeNumber As String
            If target_range.Offset(RowOffset:=-1) <> vbNullString Then
                BeforeNumber = target_range.Offset(RowOffset:=-1).Value
            Else
                BeforeNumber = target_range.End(xlUp).Value
            End If

            If BeforeNumber = vbNullString Then
                GetNextNumber = "①"
            ElseIf Asc(BeforeNumber) >= -30912 And Asc(BeforeNumber) <= -30912 + 18 Then
                GetNextNumber = Chr(Asc(BeforeNumber) + 1)
            Else
                GetNextNumber = "①"
            End If
    End If
End Function

実際設定する時は、こんな感じだ。数式を書いているセルを、引数としている。
f:id:Infoment:20191012140738p:plain

それでは、入れ替えて実験してみよう。
f:id:Infoment:20191012141019g:plain

一応、想定した動きを実現できた。これで週報を書く時間と、文字入れ替えの面倒くささにまつわるストレスが、少しだけ低減できそうだ。
※決して、週報を書くのが面倒だと言っている訳ではないですよ?
 と、謎の言い訳を添えておきます。

参考まで。