Agar macro tidak mengulang perintah dari awal

  1. 4 minggu lalu

    apakah macro di bawah bisa disederhanakan ? dan apa yang harus ditambahkan supaya macro tersebut tidak perlu menjalan kan perintah dari awal lg??

    Sub amb()

    Dim i As Long
    Dim last As Long
    last = Sheet1.Range("b3").CurrentRegion.Rows.Count

    For i = 3 To last
    If Sheet1.Cells(i, 2).Value = "Leoni Carpet" Then
    Sheet1.Cells(i, 3).Value = "AMB-001"
    ElseIf Sheet1.Cells(i, 2).Value = "Antara Textile" Then
    Sheet1.Cells(i, 3).Value = "AMB-002"
    ElseIf Sheet1.Cells(i, 2).Value = "Balai Inseminasi Buatan" Then
    Sheet1.Cells(i, 3).Value = "AMB-003"
    ElseIf Sheet1.Cells(i, 2).Value = "KINGTEX / IBU.CALDORA" Then
    Sheet1.Cells(i, 3).Value = "AMB-004"
    ElseIf Sheet1.Cells(i, 2).Value = "Bintang Harapan Kurnia" Then
    Sheet1.Cells(i, 3).Value = "AMB-005"

  2. Caton

    Nov 6 Terverifikasi Indonesia + 17.741 Poin
    Di sunting 4 minggu lalu oleh Caton

    @raibarong ...

    ... apakah macro di bawah bisa disederhanakan ...

    Saya asumsikan, yang Anda maksud adalah script yang berada di dalam pengulangan :

    For i = 3 To last
        ...
    Next

    Menurut saya, ada beberapa cara yang bisa dilakukan, diantaranya :

    1 — Menggunakan fungsi SELECT.

    For i = 3 To last
        Select Case Sheet2.Cells(i, 2)
            Case "Leoni Carpet": Sheet2.Cells(i, 3) = "AMB1"
            Case "Antara Textile": Sheet2.Cells(i, 3) = "AMB2"
            Case "Balai Inseminasi Buatan": Sheet2.Cells(i, 3) = "AMB3"
            Case "KINGTEX / IBU.CALDORA": Sheet2.Cells(i, 3) = "AMB4"
            Case "Bintang Harapan Kurnia": Sheet2.Cells(i, 3) = "AMB5"
        End Select
    Next

    2 — Menggunakan fungsi ARRAY.

    Sub AMB()
        Dim vValues As Variant
        Dim lX As Long, lY As Long, lR As Long
        Dim sVal As String
    
        vValues = Array( _
            "Leoni Carpet:AMB-001", _
            "Antara Textile:AMB-002", _
            "Balai Inseminasi Buatan:AMB-003", _
            "KINGTEX / IBU.CALDORA:AMB-004", _
            "Bintang Harapan Kurnia:AMB-005" _
        )
        
        lR = Sheet1.Range("B3").CurrentRegion.Rows.Count
        
        For lX = 3 To lR
            sVal = Sheet1.Cells(lX, 2)
            For lY = 0 To UBound(vValues)
                If sVal = Split(vValues(lY), ":")(0) Then
                    Sheet1.Cells(lX, 3) = Split(vValues(lY), ":")(1)
                    Exit For
                End If
            Next
        Next
    End Sub

    3 — Menggunakan fungsi INDEX + MATCH.

    Sub AMB()
        Dim vValues As Variant, vData As Variant, vMatch As Variant
        Dim sVal As String
        Dim lR As Long
        
        vValues = Sheet2.Range("B3:C7").Value2
        vData = Application.Index(vValues, 0, 1)
        
        lR = Sheet1.Range("B3").CurrentRegion.Rows.Count
        
        For lX = 3 To lR
            sVal = Sheet1.Cells(lX, 2)
            vMatch = Application.Match(sVal, vData, 0)
            If IsNumeric(vMatch) Then
                Sheet1.Cells(lX, 3) = Application.Index(vValues, vMatch, 2)
            End If
        Next
    End Sub

    Untuk yang terakhir ini, sebelumnya buat terlebih dahulu tabel acuannya. Misalkan seperti berikut:

    image_2021-11-06_003548.png

    ... apa yang harus ditambahkan supaya macro tersebut tidak perlu menjalan kan perintah dari awal lg ...

    Ini maksudnya agar proses pengisian datanya tidak mulai dari baris awal lagi? Kalau demikian, scriptnya tergantung bagaimana proses yang akan Anda lakukan saat mengisi datanya. Misalkan Anda hanya ingin mengisi nilai untuk baris terakhir saja, misalkan pada sel C7 seperti pada gambar berikut,

    image_2021-11-06_010433.png

    maka Anda bisa menggunakan script seperti berikut:

    lR = Sheet1.Cells(Rows.Count, "B").End(xlUp).Row

    Variabel lR pada script tersebut jika dieksekusi akan menghasilkan nilai 7. Contoh scriptnya :

    Sub AMB()
        Dim vValues As Variant, vData As Variant, vMatch As Variant
        Dim sVal As String
        Dim lR As Long
        
        vValues = Sheet2.Range("B3:C7").Value2
        vData = Application.Index(vValues, 0, 1)
        
        '+-- Tentukan baris akhir data.
        lR = Sheet1.Cells(Rows.Count, "B").End(xlUp).Row
        
        sVal = Sheet1.Cells(lR, "B").Value2
        vMatch = Application.Match(sVal, vData, 0)
        If IsNumeric(vMatch) Then
            Sheet1.Cells(lR, "C") = Application.Index(vValues, vMatch, 2)
        End If
    End Sub

    Atau misalkan Anda hanya ingin mengisi nilai pada range tertentu, misalkan pada range C5:C7 seperti pada gambar berikut,

    image_2021-11-06_011749.png

    maka yang perlu dilakukan adalah menentukan baris awal dan baris akhir data yang akan diproses, misalkan dengan script berikut:

    '+-- Tentukan baris awal dan akhir data.
    lX = Sheet1.Cells(Rows.Count, "C").End(xlUp).Row
    lY = Sheet1.Cells(Rows.Count, "B").End(xlUp).Row

    Contoh scriptnya :

    Sub AMB()
        Dim vValues As Variant, vData As Variant, vMatch As Variant
        Dim lX As Long, lY As Long, lIdx As Long
        Dim sVal As String
        
        vValues = Sheet2.Range("B3:C7").Value2
        vData = Application.Index(vValues, 0, 1)
        
        '+-- Tentukan baris awal dan akhir data.
        lX = Sheet1.Cells(Rows.Count, "C").End(xlUp).Row
        lY = Sheet1.Cells(Rows.Count, "B").End(xlUp).Row
        
        For lIdx = lX To lY
            sVal = Sheet1.Cells(lIdx, "B").Value2
            vMatch = Application.Match(sVal, vData, 0)
            If IsNumeric(vMatch) Then
                Sheet1.Cells(lIdx, "C") = Application.Index(vValues, vMatch, 2)
            End If
        Next
    End Sub

    Demikian, semoga bermanfaat.

  3. Di sunting 4 minggu lalu oleh raibarong

    @Caton

    Ini maksudnya agar proses pengisian datanya tidak mulai dari baris awal lagi?:

    betul mastah, karena data saya ada puluhan ribu, jika dia menghitung dari cell awal data setiap kali saya jalankan macro maka akan memakan waktu yang cukup lama.

    Kalau demikian, scriptnya tergantung bagaimana proses yang akan Anda lakukan saat mengisi datanya

    saya ingin macro berjalan dari data kosong yang terupdate saya, misal data saya dari c1:c1000 sudah terisi dengan menjalankan macro sebelumnya. lalu setelah saya update saya ingin macro menjalankan script dari data c1000:sampai seterusnya

    maka Anda bisa menggunakan script seperti berikut:

    saya cobain dulu scriptnya.. makasih banyak selalu jawab pertanyaan saya..

 

atau Mendaftar untuk ikut berdiskusi!