申し訳ありません、何かおかしな感じがしていたのですが、
TODAY() を使っているので、ワークシートを開くたびにすべての計算が再計算されます。
よって、数式で計算したら、値の貼り付けなどをして数式を値に変更する必要があります。
やっぱり、どこかに入力日でも計算のもとになる日付を入れておき、
その日付で計算することをお勧めします。
数式は ↓のXXXを入力した日付のセルに変更します。
=IF((TEXT(XXX,"mdd"))*1<116,12,
(IF(DAY(XXX)>=16,MONTH(XXX),MONTH(XXX)-1)))
どうしてもということでしたら、VBAで例えばB2:B15セルが変更されたら、
その横のA列のセルに計算結果を返す・・・といったものを作成はできます。
しかし、B2:B15セルで何らかの修正を行うとその時の計算結果に書き換えられます。
実用上は非常にあぶないので、おすすめはできません。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim m As Integer
If Intersect(Target, Range("B2:B15")) Is Nothing Then Exit Sub
If Month(Date) = 1 And Day(Date) <= 15 Then
m = 12
ElseIf Day(Date) >= 16 Then
m = Month(Date)
Else
m = Month(Date) - 1
End If
Target.Offset(0, -1).Value = m
End Sub