Menulis sesuai dengan shape.name yang di pilih

  1. 5 bulan yang lalu

    Suhu suhu disini saya ada pertanyaan mengenai VBA/Macro. Dalam hal ini saya ingin bertanya bagaimana cara kita menggunakan macro untuk menuliskan sesuai dengan shape name yg kita pilih.
    Mohon bantuannya suhu suhu.
    Terima kasih.

  2. Caton

    Peb 24 Terverifikasi Indonesia + 9.171 Poin

    Maaf mas @Yuda Pratama, bisa diperjelas kembali maksud dari:

    ... menuliskan sesuai dengan shape name ...

    Jika yang dimaksud menuliskan adalah mengisi properti TEXT dari sebuah Shape Object, maka sintaks yang bisa digunakan antara lain:

    Object.Shapes(Index).TextFrame.Characters.Caption

    atau

    Object.Shapes(Index).TextFrame.Characters.Text

    Contohnya:

    ...
    Activesheet.Shapes(1).TextFrame.Characters.Text = "Ini Rectangle Shape Object!"
    ...

    atau

    ...
    With Sheet2.Shapes("Rectangle 1").TextFrame.Characters
        .Font.Name = "Consolas"
        .Font.Size = 8
        .Caption = Sheet2.Range("AK2")
    End With
    ...

    Mungkin mas @Yuda Pratama bisa memberikan penjelasan lebih detil lagi, atau jika bisa, lampirkan file contoh yang dimaksud. Demikian... ;)

  3. @Caton Maaf mas @Yuda Pratama, bisa diperjelas kembali maksud dari:

    Jika yang dimaksud menuliskan adalah mengisi properti TEXT dari sebuah Shape Object, maka sintaks yang bisa digunakan antara lain:

    Object.Shapes(Index).TextFrame.Characters.Caption

    atau

    Object.Shapes(Index).TextFrame.Characters.Text

    Contohnya:

    ...
    Activesheet.Shapes(1).TextFrame.Characters.Text = "Ini Rectangle Shape Object!"
    ...

    atau

    ...
    With Sheet2.Shapes("Rectangle 1").TextFrame.Characters
        .Font.Name = "Consolas"
        .Font.Size = 8
        .Caption = Sheet2.Range("AK2")
    End With
    ...

    Mungkin mas @Yuda Pratama bisa memberikan penjelasan lebih detil lagi, atau jika bisa, lampirkan file contoh yang dimaksud. Demikian... ;)

    Contoh saya menamakan shape rectangle dengan lokasi10. Kemudian saya memberikan macro pada shape tersebut untuk pindah sheet dan menuju range D5, serta di D5 tersebut langsung tertulis dengan nama shape yaitu lokasi10.
    Seperti itu maksud saya mas Caton.
    Maaf jika penjelasan saya sebelumnya kurang jelas.
    Dan untuk informasi yg diatas, terima kasih mas.

  4. Caton

    Peb 24 Terverifikasi Indonesia + 9.171 Poin

    Oke, dari penjelasan di atas, saya asumsikan prosesnya sebagai berikut:

    [1] Sebuah Rectangle Shape Object dengan nama objek Lokasi10 pada sebuah Worksheet (misalkan Sheet1), ditetapkan kepada sebuah prosedur (misalkan Sub PindahSheet).

    [2] Pada prosedur yang ditetapkan (misalkan Sub PindahSheet) tersebut, disusun kode VBA yang akan mengalihkan Worksheet aktif (yakni misalkan Sheet1) ke sel D5 pada Worksheet lain (misalkan Sheet2).

    [3] Pada sel tujuan (sel D5) tersebut, diisi dengan nilai atau teks nama dari Rectangle Shape Object, yakni Lokasi10.

    Jika demikian asumsi prosesnya, maka pada dasarnya khan tinggal mengisi sel D5 tersebut dengan string Lokasi10 saja. Contohnya:

    Sub PindahSheet()
        Sheet2.Activate
        Range("D5") = "Lokasi10"
    End Sub

    atau

    Sub PindahSheet()
        Sheet2.Activate
        Range("D5").Select
        Range("D5") = "Lokasi10"
    End Sub

    Sederhana saja khan? Atau kalau pengennya lebih dinamis, kode VBA-nya bisa disusun seperti berikut:

    Sub PindahSheet()
        
        On Error GoTo errHandler
        '+-- Hanya untuk Shape Object saja!
        If ActiveSheet.Shapes(Application.Caller).Type = msoAutoShape Then
            '+-- Hanya untuk Shape Object dengan prefiks Lokasi!
            If InStr(1, Application.Caller, "Lokasi") Then
                Dim xlSheet As Worksheet
                
                '+-- Tetapkan Worksheet berdasarkan nama Shape Object!
                Select Case Application.Caller
                    Case "Lokasi01": Set xlSheet = Sheet2
                    Case "Lokasi02": Set xlSheet = Sheet3
                    Case "Lokasi03": Set xlSheet = Sheet4
                    Case "Lokasi04": Set xlSheet = Sheet5
                End Select
                
                '+-- Proses jika xlSheet adalah objek!
                If Not xlSheet Is Nothing Then
                    xlSheet.Select
                    '+-- Susun proses lainnya!
                    Range("D5").Select
                    Range("D5") = Application.Caller
                End If
            End If
        End If
    
    errHandler:
        Err.Clear
        On Error GoTo 0
    End Sub

    Pada script di atas, jika ada beberapa Shape Object pada sebuah Worksheet (misalkan pada Sheet1) dimana masing-masing Shape Object diberi nama Lokasi01, Lokasi02, Lokasi03 dan Lokasi04, maka dapat digunakan properti Application.Caller untuk mengetahui nama objek yang memanggil prosedur Sub PindahSheet tersebut. Namun, perlu hati-hati dalam menggunakan properti Application.Caller, karena tidak semua objek yang didukung oleh properti tersebut (gunakan Error Trapping untuk mengalihkan atau mengendalikan kesalahan yang terjadi).

    Demikian yang dapat saya jelaskan sesuai yang saya pahami. Semoga sesuai... ;)

  5. @Caton Oke, dari penjelasan di atas, saya asumsikan prosesnya sebagai berikut:

    [1] Sebuah Rectangle Shape Object dengan nama objek Lokasi10 pada sebuah Worksheet (misalkan Sheet1), ditetapkan kepada sebuah prosedur (misalkan Sub PindahSheet).

    [2] Pada prosedur yang ditetapkan (misalkan Sub PindahSheet) tersebut, disusun kode VBA yang akan mengalihkan Worksheet aktif (yakni misalkan Sheet1) ke sel D5 pada Worksheet lain (misalkan Sheet2).

    [3] Pada sel tujuan (sel D5) tersebut, diisi dengan nilai atau teks nama dari Rectangle Shape Object, yakni Lokasi10.

    Jika demikian asumsi prosesnya, maka pada dasarnya khan tinggal mengisi sel D5 tersebut dengan string Lokasi10 saja. Contohnya:

    Sub PindahSheet()
        Sheet2.Activate
        Range("D5") = "Lokasi10"
    End Sub

    atau

    Sub PindahSheet()
        Sheet2.Activate
        Range("D5").Select
        Range("D5") = "Lokasi10"
    End Sub

    Sederhana saja khan? Atau kalau pengennya lebih dinamis, kode VBA-nya bisa disusun seperti berikut:

    Sub PindahSheet()
        
        On Error GoTo errHandler
        '+-- Hanya untuk Shape Object saja!
        If ActiveSheet.Shapes(Application.Caller).Type = msoAutoShape Then
            '+-- Hanya untuk Shape Object dengan prefiks Lokasi!
            If InStr(1, Application.Caller, "Lokasi") Then
                Dim xlSheet As Worksheet
                
                '+-- Tetapkan Worksheet berdasarkan nama Shape Object!
                Select Case Application.Caller
                    Case "Lokasi01": Set xlSheet = Sheet2
                    Case "Lokasi02": Set xlSheet = Sheet3
                    Case "Lokasi03": Set xlSheet = Sheet4
                    Case "Lokasi04": Set xlSheet = Sheet5
                End Select
                
                '+-- Proses jika xlSheet adalah objek!
                If Not xlSheet Is Nothing Then
                    xlSheet.Select
                    '+-- Susun proses lainnya!
                    Range("D5").Select
                    Range("D5") = Application.Caller
                End If
            End If
        End If
    
    errHandler:
        Err.Clear
        On Error GoTo 0
    End Sub

    Pada script di atas, jika ada beberapa Shape Object pada sebuah Worksheet (misalkan pada Sheet1) dimana masing-masing Shape Object diberi nama Lokasi01, Lokasi02, Lokasi03 dan Lokasi04, maka dapat digunakan properti Application.Caller untuk mengetahui nama objek yang memanggil prosedur Sub PindahSheet tersebut. Namun, perlu hati-hati dalam menggunakan properti Application.Caller, karena tidak semua objek yang didukung oleh properti tersebut (gunakan Error Trapping untuk mengalihkan atau mengendalikan kesalahan yang terjadi).

    Demikian yang dapat saya jelaskan sesuai yang saya pahami. Semoga sesuai... ;)

    Terima Kasih Mas Caton atas informasinya, namun disini saya ada problem lagi. Saya sudah menggunakan application caller seperti diatas namun terdapat kendala, ketika didalam shape tersebut ada textbox dan yang ke click adalah textbox tersebut maka nama textbox terkait yang muncul. setelah saya coba group ternyata hasilnya sama aja tetap sesuai yang di click. untuk Peta sudah terlampir. didalam Peta tersebut ada Macro M001A dimana macro tersebut adalah perintah yang menulis lokasi secara manual (Lokasi 001A) dan Macro1 adalah perintah yang menggunakan application caller (Lokasi 001C). yang saya inginkan disini adalah seperti Macro1 yang hanya 1 macro dapat digunakan semua lokasi, berbeda dengan Macro M001A dimana 1 lokasi membutuhkan 1 Macro. Namun dalam Macro1 didapat kendala jika didalam shape tersebut ada textbox dan yang ke click adalah textbox tersebut makan name yang muncul adalah name textbox itu sendiri. Mungkin Mas Caton dapat memberi saran dan masukan untuk Peta yang sedang saya buat saat ini. Terima Kasih.

  6. Caton

    Peb 25 Terverifikasi Indonesia + 9.171 Poin
    Di sunting 5 bulan yang lalu oleh Caton

    Solusinya cukup sederhana dan mudah mas @Yuda Pratama ... Berikut proses yang dapat dilakukan:

    [1]. Kelompokkan (grup) setiap objek per Hotspot.
    [2]. Untuk setiap grup, berikan nama Hotspot-nya, misalkan 001C.
    [3]. Berikan nama setiap objek dalam setiap grup dengan pola (pattern) tertentu, misalkan AAA999Z, dimana AAA adalah prefiks objek, 999 adalah indeks lokasi dan Z adalah sub indeks lokasinya.

    Ambil contoh untuk lokasi 001C, yang terdiri dari 2 objek TextBox dan sebuah Freeform Object. Grup objeknya diberi nama 001C, sedangkan masing-masing objek dalam grup tersebut diberikan nama MAP001C untuk Freeform Object, IDX001C untuk TextBox pertama (dengan teks 001), dan SUB001C untuk TextBox kedua (dengan teks C). Coba perhatikan screen shoot berikut:

    Shoot065.png

    [4]. Untuk mengambil nama lokasinya, gunakan fungsi MID. Kode VBA-nya sebagai berikut:

    Sub Macro2()
        Sheets("Lokasi").Select
        Range("D6").Select
        Range("D6") = Mid(Application.Caller, 4, 4)
    End Sub

    Demikian yang dapat saya sarankan. Semoga sesuai... ;)

  7. @Caton Solusinya cukup sederhana dan mudah mas @Yuda Pratama ... Berikut proses yang dapat dilakukan:

    [1]. Kelompokkan (grup) setiap objek per Hotspot.
    [2]. Untuk setiap grup, berikan nama Hotspot-nya, misalkan 001C.
    [3]. Berikan nama setiap objek dalam setiap grup dengan pola (pattern) tertentu, misalkan AAA999Z, dimana AAA adalah prefiks objek, 999 adalah indeks lokasi dan Z adalah sub indeks lokasinya.

    Ambil contoh untuk lokasi 001C, yang terdiri dari 2 objek TextBox dan sebuah Freeform Object. Grup objeknya diberi nama 001C, sedangkan masing-masing objek dalam grup tersebut diberikan nama MAP001C untuk Freeform Object, IDX001C untuk TextBox pertama (dengan teks 001), dan SUB001C untuk TextBox kedua (dengan teks C). Coba perhatikan screen shoot berikut:

    [attachment:5a92440d9d615]

    [4]. Untuk mengambil nama lokasinya, gunakan fungsi MID. Kode VBA-nya sebagai berikut:

    Sub Macro2()
        Sheets("Lokasi").Select
        Range("D6").Select
        Range("D6") = Mid(Application.Caller, 4, 4)
    End Sub

    Demikian yang dapat saya sarankan. Semoga sesuai... ;)

    Terima kasih mas Caton atas solusinya. ????

  8. Caton

    Peb 25 Terverifikasi Indonesia + 9.171 Poin

    Sama-sama mas @Yuda Pratama ...

 

atau Mendaftar untuk ikut berdiskusi!