Cara Mendapatkan Shape yang Diklik tanpa Aplikasi.Caller

Bagaimana cara mengambil bentuk yang diklik untuk menjalankan makro, tanpa menggunakan Application.Caller?. Namanya atau bentuknya sendiri sebagai suatu benda.

Saya tidak dapat menggunakan Application.Caller karena jika nama bentuk lebih besar dari 30 karakter, maka hanya 30 karakter pertama yang diambil.

Mungkin ada API yang bisa mengambil objek Sape?

Sunting:

  1. Saya tidak ingin mengulang bentuk dalam lembar. Mengulangi semua bentuk di buku kerja membutuhkan terlalu banyak waktu.
  2. Saya tidak bisa mengganti nama Bentuk.

Terima kasih


person CaBieberach    schedule 25.09.2012    source sumber
comment
Ulangi setiap bentuk dan uji apakah left(shp,30) = Application.caller, atau kode keras nama bentuk di acara Shape Click?   -  person    schedule 25.09.2012
comment
Hai ooo; Terima kasih atas bantuan Anda. Membandingkan 30 karakter pertama mungkin berhasil pada sebagian besar kasus, tetapi saya harus 100% yakin bahwa saya mendapatkan karakter yang benar (jadi saya tidak ingin menggunakan pendekatan ini). Sayangnya mengulang bentuk adalah proses yang sangat lambat.   -  person CaBieberach    schedule 25.09.2012
comment
Apakah Anda benar-benar membutuhkan 30 karakter untuk mengidentifikasi suatu bentuk? Jika banyak yang menjadi bagasi maka kurangi stringnya atau lakukan pencarian berdasarkan nama yang lebih pendek.   -  person    schedule 25.09.2012
comment
Saya memang membutuhkan nama lengkapnya. Tidak bisa mengubah apa pun.   -  person CaBieberach    schedule 26.09.2012
comment
Jika Anda tidak dapat mengganti nama objek Bentuk dan tidak ingin melakukan Loop pada semua Bentuk setiap kali Anda perlu mendaftarkan objek Bentuk dengan pengontrol dan meminta nama .OnClick meneruskan nama objek Bentuk sebagai argumen — atau gunakan beberapa kait eksternal. Hal ini tidak dapat dilakukan hanya dalam VBA menggunakan perpustakaan sistem   -  person JustinJDavies    schedule 29.09.2012


Jawaban (1)


Bisakah Anda mengganti nama objek Bentuk di Lembar Kerja Anda?

Private Sub Workbook_Open()
Dim shp As shape
Dim i As Integer

For Each shp In ThisWorkbook.Sheets(1).Shapes
    shp.Name = "Shape" & Format(i, "0000")
    i = i + 1
Next shp
End Sub

Alternatifnya, Anda dapat mengatur properti .OnAction setiap bentuk secara manual untuk meneruskan nama bentuk ke fungsi Anda:

Sub RenameShapes2()

    Dim shp As shape
    Dim i As Integer

    For Each shp In ThisWorkbook.Sheets(1).Shapes
        shp.name = "Shape" & "abcdefghijklmnopqrstuvwxyz0123456789_" & Format(i, "0000")
        shp.OnAction = "'userFunction """ & shp.name & """'"
        i = i + 1
    Next shp

End Sub


Sub userFunction(name As String)
    MsgBox name
End Sub 

Ini memungkinkan Anda memiliki nama Bentuk yang panjangnya lebih dari 30 karakter. Tapi itu agak jelek

person JustinJDavies    schedule 25.09.2012
comment
Jika Anda tidak menggunakan metode ini, perhatikan bahwa tidak ada jaminan bahwa tidak ada beberapa objek Bentuk dengan properti .Name yang sama. Jika Anda memanggil Bentuk(‹‹Nama››) ia hanya akan mengembalikan salah satu objek Bentuk kepada Anda tanpa peringatan bahwa objek lain juga cocok dengan permintaan Anda - person JustinJDavies; 25.09.2012
comment
Hai JustinJDavies. Meneruskan nama Bentuk sebagai parameter untuk Fungsi .OnAction akan berhasil. Tip yang sangat berguna. Terima kasih! - person CaBieberach; 01.10.2012