Mas @Chris212 ...
Untuk pertanyaan,
apa yang ditambabkan agar script saat dijalankan ( point 1 ) data kolom yang baru tidak tertumpuk
coba script dalam Module1 diganti menjadi seperti berikut ini:
Option Explicit
Private Const MONTHS_NAME As String = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC"
Public Sub InsertMonthTable()
Dim lRow As Long, lCol As Long, lIdx As Long
Dim vMonth As Variant
Dim sAddr As String
Application.ScreenUpdating = False
Application.EnableEvents = False
'+-- Nama blok bulan.
vMonth = Split(MONTHS_NAME, ",")
With Sheet1
.Activate
'+---------------------------------------------------
' 1. Sisipkan blok bulan yang baru
'+---------------------------------------------------
'+-- Dapatkan kolom blok bulan terakhir.
sAddr = Split(.Range("F1").CurrentRegion.Address, ":")(1)
lCol = .Range(sAddr).Column + 1
.Range("F:L").Copy '+-- Salin dari blok pertama.
'+-- Tempel blok bulan yang baru setelah blok terakhir.
.Columns(lCol).EntireColumn.Insert Shift:=xlToRight
'+-- Bersihkan area blok bulan yang baru.
.Cells(3, lCol).Resize(200, 7).ClearContents
'+-- Hitung indeks blok bulan terakhir.
lIdx = .Range(Cells(1, "F"), Cells(1, lCol - 1)).Columns.Count \ 7
If lIdx > 12 Then lIdx = 1
'+-- Isi nama blok bulan terakhir.
.Cells(1, lCol).Value2 = vMonth(lIdx)
'+---------------------------------------------------
' 2. Definisi ulang nama range rgBulanBerjalan
'+---------------------------------------------------
lRow = 3
'+-- Dapatkan kolom blok bulan terakhir.
sAddr = Split(.Range("F1").CurrentRegion.Address, ":")(1)
lCol = (.Range(sAddr).Column - 7) + 1
'+-- Buat alamat range blok bulan terakhir.
sAddr = .Cells(lRow, lCol).Resize(105, 7).Address
sAddr = "='" & Sheet1.Name & "'!" & sAddr
'+-- Simpan alamat range blok bulan terakhir ke Named Range.
ThisWorkbook.Names("rgBulanBerjalan").RefersTo = sAddr
End With
Application.CutCopyMode = False
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Karena saat ini saya harus ke lapangan, untuk pertanyaan kedua, nanti saya update kembali. Pada script di atas, ada nama range rgBulanBerjalan yang nanti digunakan untuk proses update nilai sesuai pertanyaan kedua (mungkin bisa menggunakan formula atau via VBA). Jangan lupa, sebelum mengeksekusi script di atas, nama range range tersebut sudah ada duluan (lihat contoh file terlampir).
Demikian.