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

LEHOC

Thành viên chính thức
Tham gia ngày
11 Tháng một 2017
Bài viết
80
Được thích
0
Điểm
168
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!
 

thuanfun

Thành viên chính thức
Tham gia ngày
7 Tháng hai 2009
Bài viết
73
Được thích
71
Điểm
680
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
 

LEHOC

Thành viên chính thức
Tham gia ngày
11 Tháng một 2017
Bài viết
80
Được thích
0
Điểm
168
Để 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?
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,277
Được thích
52,671
Điểm
11,910
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?
 

LEHOC

Thành viên chính thức
Tham gia ngày
11 Tháng một 2017
Bài viết
80
Được thích
0
Điểm
168
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 ạ.
 

LEHOC

Thành viên chính thức
Tham gia ngày
11 Tháng một 2017
Bài viết
80
Được thích
0
Điểm
168
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.
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,277
Được thích
52,671
Điểm
11,910
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
 

LEHOC

Thành viên chính thức
Tham gia ngày
11 Tháng một 2017
Bài viết
80
Được thích
0
Điểm
168
Để 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)
Cảm ơn bác đã quan tâm.
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,277
Được thích
52,671
Điểm
11,910

LEHOC

Thành viên chính thức
Tham gia ngày
11 Tháng một 2017
Bài viết
80
Được thích
0
Điểm
168
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
Cảm ơn
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,277
Được thích
52,671
Điểm
11,910
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?
 

LEHOC

Thành viên chính thức
Tham gia ngày
11 Tháng một 2017
Bài viết
80
Được thích
0
Điểm
168
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!
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
1,196
Được thích
1,093
Điểm
560
Để 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
 
Top Bottom