PERULANGAN UNTUK IF ELSE

  1. 6 tahun lalu
    Function mangkut(tgl As String, nmsheet As String, ref As String)
    Dim rangesum As Variant
    Dim cr_range As Variant
    Dim kriteria As Variant
    
    kriteria = Workbooks("REKAP EDI.xlsx").Worksheets("REKAP EDI").Range(ref) 'blok pada sheet rekap edi
    
    If tgl = "1" And nmsheet = "manual" Then
        Set rangesum = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("B:B") 'cell yang mau dijumlahkan
        Set cr_range = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("A:A") 'syarat yang nantinya akan sama dengan kriteria
        
    ElseIf tgl = "2" And nmsheet = "manual" Then
        Set rangesum = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("G:G")
        Set cr_range = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("F:F")
    
    ElseIf tgl = "3" And nmsheet = "manual" Then
        Set rangesum = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("L:L")
        Set cr_range = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("K:K")
    End If
    
        mangkut = Application.WorksheetFunction.SumIfs(rangesum, cr_range, kriteria)
        
    End Function


    saya punya masalah dimana saya harus membuat elseif sebanyak 30, saya meminta bantuan kepada teman 1 forum ini untuk membantu saya agar saya tidak perlu membuat fungsi IF ELSE sebanyak 30

  2. Caton

    27 Jan 2018 Terverifikasi Jawaban Terpilih Indonesia + 20.101 Poin

    Bisa dicoba dengan memodifikasi script di atas menjadi:

    Function mAngkut(Day As String, SheetName As String, Ref As String) As Variant
        Dim xlSumRange As Range, xlCrtRange As Range
        Dim sAddr1 As String, sAddr2 As String
        Dim lCol As Long, lDay As Long
        Dim xCriteria
    
        xCriteria = Workbooks("REKAP EDI.xlsx").Worksheets("REKAP EDI").Range(Ref)
        
        mAngkut = 0
        If Ucase$(Trim$(SheetName)) = "MANUAL" Then
            With Workbooks("REKAP EDI.xlsx").Worksheets("manual")
                For lDay = 1 To 30
                    If lDay = CLng(Day) Then
                        lCol = (lDay * 5) - 4
                        '+-- Ambil string alamat kolom.
                        sAddr1 = Split(Cells(1, lCol).Address(1, 0), "$")(0)
                        sAddr2 = Split(Cells(1, lCol + 1).Address(1, 0), "$")(0)                    
                        '+-- Buat menjadi alamat range.
                        sAddr1 = sAddr1 & ":" & sAddr1
                        sAddr2 = sAddr2 & ":" & sAddr2
                        Set xlCrtRange = .Range(sAddr1)
                        Set xlSumRange = .Range(sAddr2)
                        
                        Exit For
                    End If
                Next
                mAngkut = Application.WorksheetFunction.SumIfs(xlSumRange, xlCrtRange, xCriteria)
            End With
        End If
                
    End Function

    Silahkan dicoba dahulu. Karena script tersebut hanya berdasarkan analisa, kemungkinan kesalahan masih ada. Demikian... ;)

  3. terimkasih mas @Caton script nya berhasil mas

    tapi saya harap mas bisa jelaskan syntax yang ini

    lCol = (lDay * 5) - 4
                        '+-- Ambil string alamat kolom.
                        sAddr1 = Split(Cells(1, lCol).Address(1, 0), "$")(0)
                        sAddr2 = Split(Cells(1, lCol + 1).Address(1, 0), "$")(0)

    karena saya masih kurang mengerti dari syntax itu mas. terimakasih bantuan nya mas @Caton

  4. Di sunting 6 tahun lalu oleh robyrnl

    mas @Caton dalam kasus yang sama, hasil pada cel berikutnya ada tanda kurung nya mas, apakah ini salah syntax atau memang seperti itu? saya juga mencoba menambahkan kondisi baru apa bila sheet yang dipilih adalah sheet rekap. ini scriptnya mas @Caton

    Option Explicit
    
    Function mAngkut(Day As String, SheetName As String, Ref As String) As Variant
        Dim xlSumRange As Range, xlCrtRange As Range
        Dim sAddr1 As String, sAddr2 As String
        Dim lCol As Long, lDay As Long
        Dim xCriteria
    
        xCriteria = Workbooks("REKAP EDI.xlsx").Worksheets("REKAP EDI").Range(Ref)
        
        mAngkut = 0
        If UCase$(Trim$(SheetName)) = "MANUAL" Then
            With Workbooks("REKAP EDI.xlsx").Worksheets("manual")
                For lDay = 1 To 30
                    If lDay = CLng(Day) Then
                        lCol = (lDay * 5) - 4
                        '+-- Ambil string alamat kolom.
                        sAddr1 = Split(Cells(1, lCol).Address(1, 0), "$")(0)
                        sAddr2 = Split(Cells(1, lCol + 1).Address(1, 0), "$")(0)
                        '+-- Buat menjadi alamat range.
                        sAddr1 = sAddr1 & ":" & sAddr1
                        sAddr2 = sAddr2 & ":" & sAddr2
                        Set xlCrtRange = .Range(sAddr1)
                        Set xlSumRange = .Range(sAddr2)
                        
                        Exit For
                    End If
                Next
                mAngkut = Application.WorksheetFunction.SumIfs(xlSumRange, xlCrtRange, xCriteria)
                '+-- mAnggkut = xlCrtRange
            End With
        ElseIf UCase$(Trim$(SheetName)) = "REKAP" Then
            With Workbooks("REKAP EDI.xlsx").Worksheets("REKAP")
                For lDay = 1 To 30
                    If lDay = CLng(Day) Then
                        lCol = (lDay * 4) + 2
                        '+-- Ambil string alamat kolom.
                        sAddr1 = Split(Cells(1, lCol).Address(1, 0), "$")(0)
                        '+-- sAddr2 = Split(Cells(1, lCol + 1).Address(1, 0), "$")(0)
                        '+-- Buat menjadi alamat range.
                        '+-- sAddr1 = sAddr1 & ":" & sAddr1
                        sAddr1 = sAddr1 & ":" & sAddr1
                        Set xlCrtRange = Workbooks("REKAP EDI.xlsx").Worksheets("REKAP").Range("E:E")
                        Set xlSumRange = .Range(sAddr1)
                        
                        Exit For
                    End If
                Next
                mAngkut = Application.WorksheetFunction.SumIfs(xlSumRange, xlCrtRange, xCriteria)
                '+-- mAnggkut = xlCrtRange
            End With
        End If
                
    End Function


    file nya juga akan saya lampirkan mas

  5. pertanyaan ke 2 udah terselesaikan mas, yang tanda kurung, saya yang kurang memerhatikan mas.

    penjelasan yang pertanyaan tadi di tunggu ya mas

  6. Caton

    29 Jan 2018 Terverifikasi Indonesia + 20.101 Poin

    Pada script yang mas @Robyrnl gunakan, yakni:

    ...
    If tgl = "1" And nmsheet = "manual" Then
        Set rangesum = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("B:B")
        Set cr_range = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("A:A")
    ElseIf tgl = "2" And nmsheet = "manual" Then
        Set rangesum = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("G:G")
        Set cr_range = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("F:F")
    ElseIf tgl = "3" And nmsheet = "manual" Then
        Set rangesum = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("L:L")
        Set cr_range = Workbooks("REKAP EDI.xlsx").Worksheets("manual").Range("K:K")
    End If
    ...

    terlihat jarak antar kolom yang akan diambil untuk setiap tanggalnya (variabel tgl). Dimana untuk tanggal 1, ditentukan pada kolom A, tanggal 2 ditentukan pada kolom F dan seterusnya. Kesimpulannya, ada 5 kolom yang harus dilewati untuk setiap tanggalnya. Dengan demikian, variabel lCol pada script:

    lCol = (lDay * 5) - 4

    akan berada pada kolom yang ditentukan. Gambarannya:

    lCol = (lDay * 5) - 4 = (1 * 5) - 4 = 1	: kolom A
    lCol = (lDay * 5) - 4 = (2 * 5) - 4 = 6	: kolom F

    demikian seterusnya sesuai dengan nilai variabel lDay. Oleh karena kolom ke-n sudah didapatkan, maka selanjutnya adalah mengubah nilai kolom pada variabel lCol menjadi notasi kolom yang sesuai dengan menggunakan script:

    '+-- Ambil string alamat kolom.
    sAddr1 = Split(Cells(1, lCol).Address(1, 0), "$")(0)
    sAddr2 = Split(Cells(1, lCol + 1).Address(1, 0), "$")(0)

    Script tersebut jika diurai untuk lCol = 2 maka:

    sAddr1 = Split(Cells(1, lCol).Address(1, 0), "$")(0)
    sAddr1 = Split(Cells(1, 6).Address(1, 0), "$")(0)
    sAddr1 = Split(F$1, "$")(0)
    sAddr1 = ({"F", "1"})(0)
    sAddr1 = "F"

    Pada script tersebut, argumen Cells(1, lCol).Address(1, 0) akan menghasilkan alamat kolom dalam bentuk teks (String) dengan ketentuan baris absolut (ditentukan dengan .Address(1, 0)). Pada contoh script tersebut, hasilnya adalah F$1. Fungsi SPLIT akan mengubah nilai F$1 menjadi array 2 elemen, yakni "F" dan "1". Oleh karena secara default VBA akan menghasilkan elemen array dengan basis elemen awal 0 (nol), maka notasi (0) di akhir script akan mengembalikan elemen array ke-0, yakni "F". Untuk script:

    sAddr2 = Split(Cells(1, lCol + 1).Address(1, 0), "$")(0)

    penjelasannya sama saja, hanya berbeda pada kolom ke-n yang diproses (sesuai penjelasan di atas, maka akan memproses kolom ke 7, yakni kolom G).

    Demikian semoga jelas... ;)

  7. terbaik lah mas @Caton
    terimakasih atas penjelasan nya yang sanagat detil sekali mas

 

atau Mendaftar untuk ikut berdiskusi!