Buka file Template yang diunduh dari laman Jakedu
Tekan ALT + F11 untuk membuka VBA Editor.
Klik Insert > Module, lalu tempelkan kode berikut:
Jalankan makro tersebut (F5). Anda tinggal memilih file sumber ketika jendela pemilih file muncul, dan data akan terisi secara otomatis!
Agar tidak merubah kode, sesuaikan file sumber nilai sebagai berikut:
Nama Sheet: SumberNilai
NIK; Kolom AC
Nama; Kolom AD
Nilai PKN; Kolom CG
Nilai Bhs Indonesia; Kolom CH
Nilai Matematika; Kolom CI
Nilai Bahasa Inggris; Kolom CJ
Sub TarikDataNilai_Fix()
Dim wbSumber As Workbook
Dim wsTemplate As Worksheet, wsSumber As Worksheet
Dim dict As Object
Dim lastRowTpl As Long, lastRowSbr As Long
Dim i As Long, nik As String
Dim sourceFilePath As String
' 1. PENYESUAIAN: Set sheet aktif pada file template Anda
On Error Resume Next
Set wsTemplate = ThisWorkbook.Sheets("Template Nilai")
On Error GoTo 0
If wsTemplate Is Nothing Then
MsgBox "Sheet 'Template Nilai' tidak ditemukan di file ini!", vbCritical, "Error"
Exit Sub
End If
' 2. Pilih File Sumber (Nilai_KJP.xlsx)
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Pilih File Sumber (Nilai_KJP.xlsx)"
.Filters.Clear
.Filters.Add "Excel Files", "*.xlsx; *.xlsm; *.xls"
If .Show = -1 Then
sourceFilePath = .SelectedItems(1)
Else
Exit Sub
End If
End With
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' 3. Buka file sumber secara background
Set wbSumber = Workbooks.Open(sourceFilePath, ReadOnly:=True)
' 4. PENYESUAIAN: Set sheet target pada file sumber
On Error Resume Next
Set wsSumber = wbSumber.Sheets("SumberNilai")
On Error GoTo 0
If wsSumber Is Nothing Then
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
wbSumber.Close SaveChanges:=False
MsgBox "Sheet 'SumberNilai' tidak ditemukan di file yang Anda pilih!", vbCritical, "Error"
Exit Sub
End If
' 5. Gunakan Scripting.Dictionary untuk pencarian ultra-cepat
Set dict = CreateObject("Scripting.Dictionary")
lastRowSbr = wsSumber.Cells(wsSumber.Rows.Count, "AC").End(xlUp).Row
For i = 2 To lastRowSbr ' Asumsi data dimulai dari baris 2 (di bawah header)
' Gunakan CStr untuk memastikan NIK dibaca sebagai Teks/String agar tidak error jika ada format mixed
nik = Trim(CStr(wsSumber.Cells(i, "AC").Value))
If nik <> "" And Not dict.Exists(nik) Then
' Simpan nilai CG, CH, CI, CJ dalam bentuk Array
dict.Add nik, Array(wsSumber.Cells(i, "CG").Value, _
wsSumber.Cells(i, "CH").Value, _
wsSumber.Cells(i, "CI").Value, _
wsSumber.Cells(i, "CJ").Value)
End If
Next i
' Tutup file sumber karena data sudah disalin ke memori RAM (Dictionary)
wbSumber.Close SaveChanges:=False
' 6. Isikan ke file Template
lastRowTpl = wsTemplate.Cells(wsTemplate.Rows.Count, "B").End(xlUp).Row
For i = 2 To lastRowTpl ' Asumsi data dimulai dari baris 2
nik = Trim(CStr(wsTemplate.Cells(i, "B").Value))
If dict.Exists(nik) Then
wsTemplate.Cells(i, "F").Value = dict(nik)(0)
wsTemplate.Cells(i, "G").Value = dict(nik)(1)
wsTemplate.Cells(i, "H").Value = dict(nik)(2)
wsTemplate.Cells(i, "I").Value = dict(nik)(3)
End If
Next i
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Proses pemindahan data nilai berhasil!", vbInformation, "Selesai"
End Sub