excel-macro-buffer-stock-simple
excel-macro-buffer-stock-simple
' ====================================================================
' FUNGSI PEMBANTU
' ====================================================================
Function SheetExists(sheetName As String) As Boolean
' Fungsi untuk mengecek apakah sheet sudah ada
On Error Resume Next
SheetExists = (Sheets(sheetName).Name <> "")
On Error GoTo 0
End Function
' ====================================================================
' SETUP SHEET DASHBOARD
' ====================================================================
Sub SetupDashboard()
' Setup dashboard layout
With Sheets("Dashboard")
' Judul
.Range("A1").Value = "DASHBOARD BUFFER STOCK BARANG IT"
.Range("A1:H1").Merge
.Range("A1").Font.Size = 16
.Range("A1").Font.Bold = True
.Range("A1").HorizontalAlignment = xlCenter
' Tombol
.Shapes.AddShape(msoShapeRoundedRectangle, 50, 50, 120, 30).Select
Selection.ShapeRange.Fill.ForeColor.RGB = RGB(0, 112, 192)
Selection.ShapeRange.TextFrame2.TextRange.Characters.Text = "Tambah Item"
Selection.ShapeRange.TextFrame2.TextRange.Font.Fill.ForeColor.RGB =
RGB(255, 255, 255)
Selection.ShapeRange.TextFrame2.TextRange.Font.Bold = msoTrue
Selection.ShapeRange.OnAction = "TambahItem"
Selection.ShapeRange.Name = "btnTambah"
' Filter
.Range("A4").Value = "Filter Indent:"
.Range("A4").Font.Bold = True
.Range("B4").Value = "Semua"
.Range("C4").Value = "1 Bulan"
.Range("D4").Value = "2 Bulan"
.Range("E4").Value = "3 Bulan"
.Range("F4").Value = "> 3 Bulan"
.Range("B4:F4").Select
Selection.Borders.LineStyle = xlContinuous
Selection.Font.Bold = True
Selection.HorizontalAlignment = xlCenter
Selection.Interior.Color = RGB(217, 217, 217)
.Range("A6:H6").Select
Selection.Font.Bold = True
Selection.Interior.Color = RGB(0, 112, 192)
Selection.Font.Color = RGB(255, 255, 255)
Selection.Borders.LineStyle = xlContinuous
Selection.HorizontalAlignment = xlCenter
' ====================================================================
' SETUP SHEET DATA
' ====================================================================
Sub SetupDataSheet()
With Sheets("Data")
' Header
.Range("A1").Value = "ID"
.Range("B1").Value = "Kode Barang"
.Range("C1").Value = "Nama Barang"
.Range("D1").Value = "Kategori"
.Range("E1").Value = "Stok Buffer"
.Range("F1").Value = "Stok Tersedia"
.Range("G1").Value = "Indent Period"
.Range("H1").Value = "Tanggal Update"
.Range("A1:H1").Select
Selection.Font.Bold = True
Selection.Interior.Color = RGB(0, 112, 192)
Selection.Font.Color = RGB(255, 255, 255)
Selection.Borders.LineStyle = xlContinuous
' ====================================================================
' SETUP SHEET SETTINGS
' ====================================================================
Sub SetupSettingsSheet()
' Setup sheet settings
With Sheets("Settings")
' Judul
.Range("A1").Value = "PENGATURAN EMAIL NOTIFIKASI"
.Range("A1:D1").Merge
.Range("A1").Font.Size = 14
.Range("A1").Font.Bold = True
.Range("A1").HorizontalAlignment = xlCenter
' Instruksi
.Range("A12").Value = "Catatan:"
.Range("A12").Font.Bold = True
.Range("A13").Value = "1. Pastikan Outlook sudah terinstal untuk
menggunakan fitur email notifikasi."
.Range("A14").Value = "2. Email notifikasi akan dikirim saat aplikasi
dibuka dan saat data diperbarui."
.Range("A15").Value = "3. Notifikasi hanya akan dikirim jika ada barang
dengan stok tersisa 1 unit."
.Range("A16").Value = "4. Interval cek digunakan untuk menghindari
pengiriman email yang terlalu sering."
' ====================================================================
' FUNGSI MENAMBAH ITEM BARU
' ====================================================================
Sub TambahItem()
' Menampilkan form untuk menambah item baru
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Data")
If lastRow = 1 Then
newID = 1
Else
newID = ws.Cells(lastRow, 1).Value + 1
End If
' ====================================================================
' FUNGSI REFRESH DATA
' ====================================================================
Sub RefreshData()
' Refresh data di dashboard berdasarkan filter yang dipilih
Dim wsData As Worksheet
Dim wsDashboard As Worksheet
Dim i As Long
For i = 2 To dataLastRow ' Mulai dari 2 karena baris 1 adalah header
Dim includeRow As Boolean
includeRow = False
If includeRow Then
' Salin data ke dashboard
wsDashboard.Cells(targetRow, 1).Value = targetRow - 6 ' Nomor urut
wsDashboard.Cells(targetRow, 2).Value = wsData.Cells(i, 2).Value ' Kode
Barang
wsDashboard.Cells(targetRow, 3).Value = wsData.Cells(i, 3).Value ' Nama
Barang
wsDashboard.Cells(targetRow, 4).Value = wsData.Cells(i, 4).Value '
Kategori
wsDashboard.Cells(targetRow, 5).Value = wsData.Cells(i, 5).Value ' Stok
Buffer
wsDashboard.Cells(targetRow, 6).Value = wsData.Cells(i, 6).Value ' Stok
Tersedia
wsDashboard.Cells(targetRow, 7).Value = wsData.Cells(i, 7).Value '
Indent Period
wsDashboard.Cells(targetRow, 8).Value = wsData.Cells(i, 8).Value '
Tanggal Update
' Atur warna baris berselang-seling dan warna khusus untuk stok kritis
If wsData.Cells(i, 6).Value = 1 Then
' Warna merah untuk stok tersisa 1
wsDashboard.Range("A" & targetRow & ":H" &
targetRow).Interior.Color = RGB(255, 199, 206)
' Warna teks bold untuk peringatan
wsDashboard.Range("F" & targetRow).Font.Bold = True
wsDashboard.Range("F" & targetRow).Font.Color = RGB(192, 0, 0)
ElseIf wsData.Cells(i, 6).Value < wsData.Cells(i, 5).Value Then
' Warna kuning untuk stok di bawah buffer namun > 1
wsDashboard.Range("A" & targetRow & ":H" &
targetRow).Interior.Color = RGB(255, 235, 156)
wsDashboard.Range("F" & targetRow).Font.Bold = True
ElseIf (targetRow - 6) Mod 2 = 0 Then
wsDashboard.Range("A" & targetRow & ":H" &
targetRow).Interior.Color = RGB(240, 240, 240)
wsDashboard.Range("F" & targetRow).Font.Bold = False
wsDashboard.Range("F" & targetRow).Font.Color = RGB(0, 0, 0)
Else
wsDashboard.Range("A" & targetRow & ":H" &
targetRow).Interior.Color = RGB(255, 255, 255)
wsDashboard.Range("F" & targetRow).Font.Bold = False
wsDashboard.Range("F" & targetRow).Font.Color = RGB(0, 0, 0)
End If
targetRow = targetRow + 1
End If
Next i
' Tampilkan pesan jika tidak ada data yang sesuai filter
If targetRow = 7 Then
wsDashboard.Range("A7").Value = "Tidak ada data yang sesuai dengan filter."
wsDashboard.Range("A7:H7").Merge
wsDashboard.Range("A7").HorizontalAlignment = xlCenter
wsDashboard.Range("A7").Font.Italic = True
End If
' ====================================================================
' FUNGSI FILTER
' ====================================================================
Sub ApplyFilter(filterRange As String)
' Fungsi untuk mengaplikasikan filter
Dim wsDashboard As Worksheet
Set wsDashboard = ThisWorkbook.Sheets("Dashboard")
' ====================================================================
' FUNGSI HAPUS ITEM
' ====================================================================
Sub HapusItem()
' Fungsi untuk menghapus item berdasarkan ID
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Data")
Dim i As Long
For i = 2 To lastRow
If ws.Cells(i, 1).Value = idNum Then
foundRow = i
Exit For
End If
Next i
If foundRow = 0 Then
MsgBox "Item dengan ID " & idToDelete & " tidak ditemukan.", vbExclamation
Exit Sub
End If
' ====================================================================
' FUNGSI EMAIL SETTINGS
' ====================================================================
Sub ShowEmailSettings()
' Tampilkan sheet settings
Sheets("Settings").Visible = xlSheetVisible
Sheets("Settings").Select
End Sub
Sub SaveEmailSettings()
' Simpan pengaturan email
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Settings")
Sub TestEmail()
' Kirim email test
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Settings")
With outlookMail
.To = emailAddr
.Subject = "Test Email dari Aplikasi Buffer Stock IT"
.Body = "Ini adalah email test dari aplikasi Buffer Stock IT." & vbCrLf &
vbCrLf & _
"Jika Anda menerima email ini, berarti pengaturan email sudah
benar." & vbCrLf & vbCrLf & _
"Tanggal & Waktu: " & Now
.Send
End With
On Error GoTo 0
' ====================================================================
' FUNGSI CEK STOK DAN KIRIM EMAIL
' ====================================================================
Sub CheckLowStockAndSendEmail()
' Cek apakah ada barang dengan stok = 1 dan kirim email jika perlu
Dim wsData As Worksheet
Dim wsSettings As Worksheet
Dim i As Long
For i = 2 To lastRow
If wsData.Cells(i, 6).Value = 1 Then ' Stok tersedia = 1
lowStockItems = lowStockItems & "- " & wsData.Cells(i, 3).Value & "
(Kode: " & _
wsData.Cells(i, 2).Value & "), Stok Tersisa: 1" & vbCrLf
End If
Next i
With outlookMail
.To = wsSettings.Range("B3").Value
.Subject = wsSettings.Range("B6").Value
.Body = "Notifikasi Stok Barang IT Kritis" & vbCrLf & vbCrLf & _
"Berikut daftar barang IT dengan stok tersisa 1 unit:" & vbCrLf
& vbCrLf & _
lowStockItems & vbCrLf & vbCrLf & _
"Mohon segera tindak lanjuti untuk menghindari kehabisan stok."
& vbCrLf & vbCrLf & _
"Email ini dikirim otomatis dari Aplikasi Buffer Stock Barang
IT pada " & Now
.Send
End With
If Err.Number = 0 Then
' Update waktu terakhir kirim email
wsSettings.Range("B9").Value = Now
wsSettings.Range("B9").NumberFormat = "dd-mmm-yyyy hh:mm"
End If
On Error GoTo 0