Cách xác định Shape trong VBA

Liên hệ QC

LEHOC

Thành viên chính thức
Tham gia
11/1/17
Bài viết
89
Được thích
0
Em chào các anh/chị!
Em có vấn đề với Shape, nhờ anh chị chỉ giáo ạ.
A/C cho em hỏi làm sao để xác định được cái tên khi gọi Shape ạ.
Em dùng tham khảo được cách này nhưng không biết cách xác định chính xác Shape trong file nếu tồn tại nhiều Shape.
Cách đã tham khảo được: ActiveSheet.Shapes("Isosceles Triangle 1")
Em cảm ơn!
 
Bạn vào tìm kiếm gõ " "ActiveSheet.Shapes
 
Upvote 0
Em chào các anh/chị!
Em có vấn đề với Shape, nhờ anh chị chỉ giáo ạ.
A/C cho em hỏi làm sao để xác định được cái tên khi gọi Shape ạ.
Em dùng tham khảo được cách này nhưng không biết cách xác định chính xác Shape trong file nếu tồn tại nhiều Shape.
Cách đã tham khảo được: ActiveSheet.Shapes("Isosceles Triangle 1")
Em cảm ơn!

Để xem tên toàn bộ các Shape đang có trên sheet thì bạn FOR từng Shape để xem tên của nó: :D

Mã:
Dim sh As shape
For Each sh In ActiveSheet.Shapes
   MsgBox sh.Name
Next

Hoặc:
Mã:
Dim i As Integer
For i = 1 To ActiveSheet.Shapes.Count
    MsgBox ActiveSheet.Shapes(i).Name
Next
 
Upvote 0
Để xem tên toàn bộ các Shape đang có trên sheet thì bạn FOR từng Shape để xem tên của nó: :D

Mã:
Dim sh As shape
For Each sh In ActiveSheet.Shapes
   MsgBox sh.Name
Next

Hoặc:
Mã:
Dim i As Integer
For i = 1 To ActiveSheet.Shapes.Count
    MsgBox ActiveSheet.Shapes(i).Name
Next
Để xem tên toàn bộ các Shape đang có trên sheet thì bạn FOR từng Shape để xem tên của nó: :D

Mã:
Dim sh As shape
For Each sh In ActiveSheet.Shapes
   MsgBox sh.Name
Next

Hoặc:
Mã:
Dim i As Integer
For i = 1 To ActiveSheet.Shapes.Count
    MsgBox ActiveSheet.Shapes(i).Name
Next
Vậy thì bất tiện bác nhỉ. Không có cách xem properties à bác?
 
Upvote 0
Vậy thì bất tiện bác nhỉ. Không có cách xem properties à bác?
Cuối cùng là bạn muốn điều gì?
1> Muốn lấy tên của đối tượng khi bạn bấm vào?
2> Muốn xác định đối tượng có tồn tại hay không thông qua cái tên?
 
Upvote 0
Cuối cùng là bạn muốn điều gì?
1> Muốn lấy tên của đối tượng khi bạn bấm vào?
2> Muốn xác định đối tượng có tồn tại hay không thông qua cái tên?
Em muốn cách đơn giản nhất để lấy được CodeName của Shape.
Cảm ơn bác đã quan tâm và chỉ giáo ạ.
 
Upvote 0
CodeName của Shape là cái gì?
Nói chung là vẫn chưa hiểu được ý bạn
Em chưa sử dụng Shape nhiều nên chưa rõ thuộc tính của đối tượng.
Ý em là: để VBA gọi được tên của Shape và điều khiền Shape (ví dụ: gán text cho Shape) thì tên này được xác định bằng cách nào dễ nhất.
Ví dụ: đối với button trên form thì có thuộc tính (Name), nếu mình muốn điều khiển gì thì gọi (Name) này là được.
 
Upvote 0
Em chưa sử dụng Shape nhiều nên chưa rõ thuộc tính của đối tượng.
Ý em là: để VBA gọi được tên của Shape và điều khiền Shape (ví dụ: gán text cho Shape) thì tên này được xác định bằng cách nào dễ nhất.
Ví dụ: đối với button trên form thì có thuộc tính (Name), nếu mình muốn điều khiển gì thì gọi (Name) này là được.
Tôi thường làm thế này:
Mã:
Dim shp As Shape, wks As Worksheet
Set wks = Worksheets("Sheet1")
Set shp = wks.Shapes("Rectangle 1")
Tức là khai báo và khởi tạo một đối tượng shp thông qua tên gọi như trên
Kể từ giờ tôi sẽ thao tác trên đối tượng shp, ngay khi bạn gõ dấu chấm sẽ có gợi ý
Ví dụ muốn gán text:
Mã:
shp.TextFrame.Characters.Text = "Anh Tuan"
Đổi màu nền:
Mã:
shp.Fill.ForeColor.RGB = vbBlue
Đại khái vậy
 
Upvote 0
Để xem tên toàn bộ các Shape đang có trên sheet thì bạn FOR từng Shape để xem tên của nó: :D

Mã:
Dim sh As shape
For Each sh In ActiveSheet.Shapes
   MsgBox sh.Name
Next

Hoặc:
Mã:
Dim i As Integer
For i = 1 To ActiveSheet.Shapes.Count
    MsgBox ActiveSheet.Shapes(i).Name
Next
Bác ơi, em dùng vòng lặp for thì xác định được tên của Shapes là"Oval 13" tại i=8.
Em thao tác gán Shapes này vào biến thì bị lỗi "object doesn't support this property or method" (error 438)
Em đã code: sha = ActiveSheet.Shapes("Oval 13"), hoặc sha = ActiveSheet.Shapes(8)
Thanks bác đã quan tâm.
 
Upvote 0
Upvote 0
Bác ơi, cho em hỏi sao em Gán text cho Shapes từ UserForm thì bị lỗi Type mismatch (Run-time error '13').
1581515969166.png
Phiền bác giúp em với.
Code của em ạ
PHP:
Dim AcSh, Shp
        Set AcSh = ActiveSheet
        Set Shp = AcSh.Shapes("Oval 22").TextFrame.Characters.Text
        Shp = Left(Shp, Len(Shp) - 1) + cbActive.ListIndex.Text
Thanks
 
Upvote 0
Bác ơi, cho em hỏi sao em Gán text cho Shapes từ UserForm thì bị lỗi Type mismatch (Run-time error '13').
View attachment 231900
Phiền bác giúp em với.
Code của em ạ
PHP:
Dim AcSh, Shp
        Set AcSh = ActiveSheet
        Set Shp = AcSh.Shapes("Oval 22").TextFrame.Characters.Text
        Shp = Left(Shp, Len(Shp) - 1) + cbActive.ListIndex.Text
Cảm ơn
Với câu hỏi này, tôi cảm thấy bạn đang bị mất căn bản nghiêm trọng, vậy sao có thể viết code được đây?
 
Upvote 0
Với câu hỏi này, tôi cảm thấy bạn đang bị mất căn bản nghiêm trọng, vậy sao có thể viết code được đây?
Em chỉ tập tành code theo yêu cầu thực tế mà bác.
Mong bác thông cảm.
Còn với vấn đề của em, bác cho em biết cái sai được không ạ?
Em cảm ơn!
 
Upvote 0
Để Xem và đổi Name của các Shape có trong worksheet bạn thực hiện như sau:
Bạn vào "Page Layout" -> chọn "Selection Pane"
("Bố trí trang" -> "Ngăn lựa chọn")

Để xác định Shape có tồn tại hay không:
PHP:
On Error Resume Next
Dim SP As Excel.Shape
Set SP = ThisWorkbook.Worksheets("SheetName").Shapes("ShapeName")
If VBA.Err.Number <> 0 Then MsgBox "Da ton tai"
On Error Goto 0
-------------------

-------------------
PHP:
Dim AcSh As Excel.Worksheet, Shp As Excel.Shape, Text As String
        Set AcSh = ActiveSheet
        ''Text không phải Object nên không thể Set
       On Error Resume Next
        Set Shp = AcSh.Shapes("Oval 22")
       If VBA.Err.Number = 0 Or Not Shp Is Nothing Then
          Text = Shp.TextFrame2.TextRange.Characters.Text
          Shp.TextFrame2.TextRange.Characters.Text = VBA.Left(Text , Len(Text) - 1) + cbActive.ListIndex.Text
       End If
 
Upvote 0
Web KT
Back
Top Bottom