วิธีรับรูปร่างที่คลิกโดยไม่ต้องใช้ Application.Caller

ฉันจะดึงรูปร่างที่ถูกคลิกเพื่อเรียกใช้มาโครโดยไม่ต้องใช้ Application.Caller ได้อย่างไร ชื่อหรือรูปร่างของมันเองเป็นวัตถุ

ฉันไม่สามารถใช้ Application.Caller ได้ เพราะหากชื่อรูปร่างมีขนาดใหญ่กว่า 30 อักขระ ก็จะดึงเฉพาะอักขระ 30 ตัวแรกเท่านั้น

อาจมี API ที่สามารถดึงวัตถุ Sape ได้หรือไม่

แก้ไข:

  1. ฉันไม่ต้องการวนรูปร่างในแผ่นงาน การวนซ้ำรูปร่างทั้งหมดในเวิร์กบุ๊กใช้เวลานานเกินไป
  2. ฉันไม่สามารถเปลี่ยนชื่อรูปร่างได้

ขอบคุณ


person CaBieberach    schedule 25.09.2012    source แหล่งที่มา
comment
วนแต่ละรูปร่างและทดสอบว่า left(shp,30) = Application.caller หรือฮาร์ดโค้ดชื่อรูปร่างในเหตุการณ์ Shape Click หรือไม่   -  person    schedule 25.09.2012
comment
สวัสดี อู; ขอบคุณสำหรับความช่วยเหลือของคุณ. การเปรียบเทียบอักขระ 30 ตัวแรกอาจช่วยได้ในกรณีส่วนใหญ่ แต่ฉันต้องแน่ใจ 100% ว่าได้อักขระที่ถูกต้อง (ดังนั้นฉันจึงไม่ต้องการใช้แนวทางนี้) น่าเสียดายที่การวนซ้ำรูปร่างเป็นกระบวนการที่ช้ามาก   -  person CaBieberach    schedule 25.09.2012
comment
คุณต้องการอักขระ 30 ตัวเพื่อระบุรูปร่างจริง ๆ หรือไม่? หากมีสัมภาระจำนวนมาก ให้ลดสตริงหรือดำเนินการค้นหาตามชื่อที่สั้นกว่า   -  person    schedule 25.09.2012
comment
ฉันต้องการชื่อเต็ม ไม่สามารถเปลี่ยนแปลงอะไรได้   -  person CaBieberach    schedule 26.09.2012
comment
หากคุณไม่สามารถเปลี่ยนชื่อวัตถุ Shape ได้ และคุณไม่ต้องการวนซ้ำรูปร่างทั้งหมดทุกครั้ง คุณจะต้องลงทะเบียนวัตถุ Shape ด้วยตัวควบคุม และให้ชื่อ .OnClick ส่งผ่านชื่อของวัตถุ Shape เป็นอาร์กิวเมนต์ หรือ ใช้ตะขอภายนอก สิ่งนี้ไม่สามารถทำได้ง่ายๆ ภายใน VBA โดยใช้ไลบรารีระบบ   -  person JustinJDavies    schedule 29.09.2012


คำตอบ (1)


คุณสามารถเปลี่ยนชื่อวัตถุรูปร่างในแผ่นงานของคุณได้หรือไม่?

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

หรือคุณสามารถตั้งค่าคุณสมบัติ .OnAction ของแต่ละรูปร่างด้วยตนเองเพื่อส่งชื่อรูปร่างไปยังฟังก์ชันของคุณ:

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 

ซึ่งจะทำให้คุณมีชื่อรูปร่างที่มีความยาวเกิน 30 อักขระได้ มันค่อนข้างน่าเกลียดแม้ว่า

person JustinJDavies    schedule 25.09.2012
comment
หากคุณไม่ได้ใช้เมธอดนี้ โปรดทราบว่าไม่มีการรับประกันว่าไม่มีออบเจ็กต์ Shape หลายรายการที่มีคุณสมบัติ .Name เหมือนกัน หากคุณเรียก Shapes(‹‹Name››) มันจะส่งคืนวัตถุ Shape หนึ่งรายการโดยไม่มีการเตือนว่าวัตถุอื่นก็ตรงกับคำขอของคุณเช่นกัน - person JustinJDavies; 25.09.2012
comment
สวัสดี JustinJDavies การส่งชื่อรูปร่างเป็นพารามิเตอร์สำหรับฟังก์ชัน .OnAction จะช่วยแก้ปัญหาได้ เคล็ดลับที่มีประโยชน์มาก ขอบคุณ! - person CaBieberach; 01.10.2012