Sub RenamePic()
On Error Resume Next
Dim Pic As Shape
Dim i As Long
For i = 2 To Range("A65536").End(3).Row
For Each Pic In ActiveSheet.Shapes
If Pic.Top >= Cells(i, 2).Top Then
If Pic.Left >= Cells(i, 2).Left Then
If Pic.Width <= Cells(i, 2).Width Then
If Pic.Height <= Cells(i, 2).Height Then
Pic.Name = Cells(i, 1)
End If
End If
End If
End If
Next
Next
End Sub
Cho em hỏi thêm 1 chút là nếu các bức ảnh có tên bất kì (Không phải là picture 1, picture 2, picture 3, ...) nhưng vẫn được sắp xếp theo thứ tự trong các ô từ trên xuống dưới trong cùng 1 cột giống như trên thì liệu có đổi được tên không ạ?Bạn chắc cũng biết về VBA vậy bạn thử với Code sau, áp dụng cho tên picture tại cột A và ảnh tại cột B, bạn có thể tự tuỳ biến
Mã:Sub RenamePic() On Error Resume Next Dim Pic As Shape Dim i As Long For i = 2 To Range("A65536").End(3).Row For Each Pic In ActiveSheet.Shapes If Pic.Top >= Cells(i, 2).Top Then If Pic.Left >= Cells(i, 2).Left Then If Pic.Width <= Cells(i, 2).Width Then If Pic.Height <= Cells(i, 2).Height Then Pic.Name = Cells(i, 1) End If End If End If End If Next Next End Sub
Tên hình bất kỳ, miễn là nó nằm trong ô được xác định vị trí Top và Left.Cho em hỏi thêm 1 chút là nếu các bức ảnh có tên bất kì (Không phải là picture 1, picture 2, picture 3, ...) nhưng vẫn được sắp xếp theo thứ tự trong các ô từ trên xuống dưới trong cùng 1 cột giống như trên thì liệu có đổi được tên không ạ?
Nếu có mong anh giúp đỡ!
Vâng đúng như anh nói. Tại em chưa test trước đã đi hỏi rồi.Tên hình bất kỳ, miễn là nó nằm trong ô được xác định vị trí Top và Left.
Có thể không cần phải xác định thêm vị trí Width và Height.
Thì sửa lại chút kết quả thôi:Vâng đúng như anh nói. Tại em chưa test trước đã đi hỏi rồi.
Cho em hỏi là em muốn đổi tên ảnh nhưng tên là số tự nhiên. VD: 1; 2; 3; 4; ....
thì code trên phải sửa như thế nào vậy anh?
If Shp.TopLeftCell.Address(0, 0) = "B" & iR + 1 _
Then Shp.Name = iR
Anh ơi hình như anh nhầm thì phải, em đâu thấy anh khai báo biến i đâu ạ?Thì sửa lại chút kết quả thôi:
Mã:If Shp.TopLeftCell.Address(0, 0) = "B" & i + 1 _ Then Shp.Name = i
Nhưng nó vẫn không đổi được tên ảnh sang kiểu số ạ!Sub Button5_Click()
Dim Shp As Shape, iR As Long
For Each Shp In ActiveSheet.Shapes
iR = iR + 1
If Shp.TopLeftCell.Address(0, 0) = "B" & iR + 1 _
Then Shp.Name = iR
Next Shp
End Sub
Mượn tạm code của anh leonguyen sửa lại giúp bạn:Em muốn hỏi thêm:
Câu hỏi cụ thể trong file ảnh đính kèm đó....!!
Sub Button5_Click()
Dim Shp As Shape, iR As Byte
For Each Shp In ActiveSheet.Shapes
iR = iR + 1
If Shp.TopLeftCell.Address(0, 0) = "D" & iR + 1 _
Then Shp.Name = Cells(iR + 1, "B")
Next Shp
End Sub
Bạn chắc cũng đang tìm hiểu VBA vậy bạn nhìn code và chú ý 2 thông số là sửa được theo ý ngay
1/ Cells(i, 2) => số 2 tương ứng cột B thay đổi sang 3 là C, 1 là A.... tương tự cho các số khác
2/ Pic.Name = Cells(i, 1) => đây là cách gán tên cho Pictuture
=> Bạn có thể dùng 2 vòng lặp và thay đổi các thông số sao cho phù hợp là được
Bạn mới tiếp cận VBA nên làm từng bước 1 sẽ dễ hiểu hơn nhé. Cụ thể như sau:Cái này thì em hiểu rùi. Nhưng còn vòng lặp nữa thì... em chưa làm được. Anh hướng dẫn em thêm cho em tham khao nhe!
Nếu áp dụng code bài #3 thì sửa lại như bài #7 (đã sửa i thành iR).Mong anh dhn46 giúp em sửa code để có thể chèn tên ảnh là các số với ạ!
Em sửa rồi nhưng vẫn không được anh ạ.Nếu áp dụng code bài #3 thì sửa lại như bài #7 (đã sửa i thành iR).
Sub Button5_Click()
Dim Shp As Shape, iR As Long
For Each Shp In ActiveSheet.Shapes
iR = iR + 1
If Shp.TopLeftCell.Address(0, 0) = "B" & iR + 1 _
Then Shp.Name = iR
Next Shp
End Sub
Nếu đổi tên Shape bất kỳ trên sheet thành số tự nhiên thì không cần xác định vị trí hình ảnh.Em sửa rồi nhưng vẫn không được anh ạ.
Có phải như vậy không anh?
Không biết bạn định học VBA hay bạn muốn gì với topic của bạn bebeenMong anh dhn46 giúp em sửa code để có thể chèn tên ảnh là các số với ạ!
[B][COLOR=#000000]Pic.Name = Cells(i, 2)
[/COLOR][/B]
[/COLOR][B][COLOR=#000000]
[/COLOR][/B][COLOR=#000000]k=k+1
Pic.Name = k[/COLOR][B][COLOR=#000000]
[/COLOR][/B]
Thực ra học thì là phụ thôi. Em định ứng dụng vào trong công việc là chính ạ!Không biết bạn định học VBA hay bạn muốn gì với topic của bạn bebeen
Nếu để học thì bạn thay thế như sau với code bài #2
Sửa đoạn
Mã:[B][COLOR=#000000]Pic.Name = Cells(i, 2) [/COLOR][/B]
thành
Mã:[B][COLOR=#000000] [/COLOR][/B][COLOR=#000000]k=k+1 Pic.Name = k[/COLOR][B][COLOR=#000000] [/COLOR][/B]
Em thử code của anh rồi nhưng vẫn không được ạ!Nếu đổi tên Shape bất kỳ trên sheet thành số tự nhiên thì không cần xác định vị trí hình ảnh.
[gpecode=vb]
Sub RenameShape()
Dim Shp As Shape, iR As Byte
For Each Shp In ActiveSheet.Shapes
iR = iR + 1
Shp.Name = iR
Next Shp
End Sub
[/gpecode]
Tham khảo trong file xem, cũng code đó và chạy bình thường.Em thử code của anh rồi nhưng vẫn không được ạ!
Ở đây cũng có đổi tên file ảnh nèEm có ý tưởng này không biết có làm được không nữa? Em đưa lên đây nhờ mọi người cho em giải pháp thực hiện nó nhé!?
Thật sự là không hiểu bạn đang muốn gì luôn.Vâng đúng là chạy được anh ạ. Nhưng anh cho em hỏi là em muốn đặt tên ảnh theo số thứ tự bên cột A có được không ạ?
Mình làm rồi nhưng không được bạn ạ! Bạn xem File đính kèm!Thật sự là không hiểu bạn đang muốn gì luôn.
Bài #2, bài #3 là để sửa lại tên hình ảnh theo cột A, bạn muốn số thì sửa cột A thành số rồi dùng code #2 hoặc #3 là được mà?
Với lại, tốt nhất là bạn gửi file của bạn lên, người khác sẽ hiểu bạn muốn làm gì trong đó.
Bạn đưa code bài #3, muốn thay đổi số theo cột A mà sửa lại kết quả trả về iR?Mình làm rồi nhưng không được bạn ạ! Bạn xem File đính kèm!
Vậy là code trong File này khác với code lúc trước anh bảo em mà.Bạn đưa code bài #3, muốn thay đổi số theo cột A mà sửa lại kết quả trả về iR?
[gpecode=vb]
Sub Button5_Click()
Dim Shp As Shape, iR As Byte
For Each Shp In ActiveSheet.Shapes
iR = iR + 1
If Shp.TopLeftCell.Address(0, 0) = "B" & iR + 1 _
Then Shp.Name = Cells(iR + 1, "A")
Next Shp
End Sub
[/gpecode]
Sub Button5_Click()
Dim Shp As Shape, iR As Byte
For Each Shp In ActiveSheet.Shapes
iR = iR + 1
If Shp.TopLeftCell.Address(0, 0) = "B" & iR + 1 _
Then Shp.Name = iR
Next Shp
End Sub
Em vẫn không chạy được anh ạ! Lạ thật đấy. Làm phiền anh nhiều quá nhưng mà đúng là vẫn chưa được.Bạn đưa code bài #3, muốn thay đổi số theo cột A mà sửa lại kết quả trả về iR?
[gpecode=vb]
Sub Button5_Click()
Dim Shp As Shape, iR As Byte
For Each Shp In ActiveSheet.Shapes
iR = iR + 1
If Shp.TopLeftCell.Address(0, 0) = "B" & iR + 1 _
Then Shp.Name = Cells(iR + 1, "A")
Next Shp
End Sub
[/gpecode]
Vậy thì bó tay rồi, nhờ các Thầy xem thôi. Trên máy mình vẫn bình thường.Em vẫn không chạy được anh ạ! Lạ thật đấy. Làm phiền anh nhiều quá nhưng mà đúng là vẫn chưa được.
Nó báo lỗi ở dòng này ạ:
Bạn đưa code bài #3, muốn thay đổi số theo cột A mà sửa lại kết quả trả về iR?
[gpecode=vb]
Sub Button5_Click()
Dim Shp As Shape, iR As Byte
For Each Shp In ActiveSheet.Shapes
iR = iR + 1
If Shp.TopLeftCell.Address(0, 0) = "B" & iR + 1 _
Then Shp.Name = Cells(iR + 1, "A")
Next Shp
End Sub
[/gpecode]
Sub Rectangle1_Click()
Dim Shp As Shape, cell_ As String
For Each Shp In ActiveSheet.Shapes
cell_ = Shp.TopLeftCell.Address(0, 0)
If Left(cell_, 1) = "B" Then Shp.Name = Range(cell_).Offset(, -1).Value
Next Shp
End Sub
Đúng như thầy nói ở mấy lần đổi đầu tiên thì OK nhưng mấy lần sau là không được nữa ạ!(Tức là mỗi lần nhấn nút chạy code đó ạ!). Chỗ em vừa mới có điện em sẽ Test thử code của thầy luôn ạ!Với ảnh và các "nút" đã có như trong bài #26 thì nhấn nút "leonguyen" chắc chắn sẽ đổi tên ảnh theo cột A, tức tên là số.
Nếu tôi không lầm thì code như thế không được. Nó đòi hỏi khi ta thiết kế sheet thì phải làm theo thứ tự: đặt tất cả các ảnh cần thiết vào các ô của cột B, tiếp theo mới đặt các Button nếu có (nút leonguyen, dnh, Show Form, Play Video v...v). Nếu trước tiên ta đặt các Button leonguyen, dnh, Show Form, Play Video v...v rồi mới Insert ảnh thì code tèo. Vì sao?
Trong 4 vòng FOR đầu thì dĩ nhiên điều kiện không thỏa cho 4 Button leonguyen, dnh, Show Form, Play Video. Trong các vòng tiếp theo thì iR = 5, 6, 7, ... nên dĩ nhiên sẽ không = B2, B3, B4 tương ứng với ảnh trong cột B. Kết quả là không có ảnh nào được đổi tên.
Cho dù ta có Insert vd. 5 ảnh (B2, ..., B6) trước sau đó mới đặt vd. 2 Button (cho việc nào đó) thì rất có thể trong tương lai khi vd. thêm sản phẩm ta phải Insert thêm vd. 3 ảnh (vào B7, B8, B9) thì 3 ảnh cuối này sẽ không được đổi tên. Vì sao? Vì với vòng FOR thứ 8 thì iR = 8 trong khi ảnh là ở B7 vậy điều kiện không thỏa. Tương tự với vòng FOR thứ 9, 10.
Tôi đề nghị code bất kỳ, ý nghĩ đầu tiên. Vd. ảnh ở cột B từ dòng 2, số ở cột A từ dòng 2
Mã:Sub Rectangle1_Click() Dim Shp As Shape, cell_ As String For Each Shp In ActiveSheet.Shapes cell_ = Shp.TopLeftCell.Address(0, 0) If Left(cell_, 1) = "B" Then Shp.Name = Range(cell_).Offset(, -1).Value Next Shp End Sub
Em đã Test thử code này và kết quả như sau:Sub Rectangle1_Click()
Dim Shp As Shape, cell_ As String
For Each Shp In ActiveSheet.Shapes
cell_ = Shp.TopLeftCell.Address(0, 0)
If Left(cell_, 1) = "B" Then Shp.Name = Range(cell_).Offset(, -1).Value
Next Shp
End Sub
Em đã Test thử code này và kết quả như sau:
+ Mấy lần bấm nút đầu tiên để đổi tên thì code chạy rất tốt.
+ Khoảng từ lần thứ 5 hay 6 gì đó trở đi là nó báo lỗi màu vàng trong đoạn code sau ạ:
Shp.Name = Range(cell_).Offset(, -1).Value
Vâng thực sự là em có chen ngang, nhưng các câu hỏi của em cũng có cùng nội dung của Topic đó chứ ạ! Em cũng chỉ đưa ra các thắc mắc thôi mà.Tôi đã quan sát khá nhiều bài hỏi chen ngang của bạn tại nhiều topic. Với kinh nghiệm học VBA và Excel cơ bản của mình tôi tự hỏi: "liệu bạn đã nắm được gì sau 1 loạt câu hỏi mà chả đi đâu tới đâu? Thích thì chen?"
Quá trình tìm hiểu thì phải có thời gian phải, ngấm chắc gì bạn đã hiểu hết vấn đề mà Test. Ví thử các code có kèm theo On Error resume next ?
Vậy nên tôi nghĩ để làm được yêu cầu của bạn chắc các Code cũng đã quá đủ, thêm "On Error resume next" nữa thì đố bạn tìm được dòng code nào màu vàng, còn để mà học thì tôi nghĩ bạn nên chọn 1 hướng tiếp cận khác.
Chúc bạn thành công!
Bạn cứ hỏi, đừng hỏi lạc đề tài là được. Nhưng đừng viết bài kiểu 2, 3 bài liên tục. Nghĩ cho kỹ, đọc cho kỹ, rồi viết 1 bài cho đủ ý, đừng viết 1 câu, rồi suy nghĩ lại viết thêm bài khác 1 câu, bài nào cũng trích dẫn thậm thượt.Vâng thực sự là em có chen ngang, nhưng các câu hỏi của em cũng có cùng nội dung của Topic đó chứ ạ! Em cũng chỉ đưa ra các thắc mắc thôi mà.
Nếu các câu hỏi của em đã làm loãng nội dung của topic này thì em xin dừng tại đây ạ!
Có gì mong BQT lượng thứ!
Chỗ em vừa mới có điện em sẽ Test thử code của thầy luôn ạ!
Em đã Test thử code này và kết quả như sau:
+ Mấy lần bấm nút đầu tiên để đổi tên thì code chạy rất tốt.
+ Khoảng từ lần thứ 5 hay 6 gì đó trở đi là nó báo lỗi màu vàng trong đoạn code sau ạ:
Shp.Name = Range(cell_).Offset(, -1).Value
Nó báo thế này thầy ạ!
View attachment 118642
Vâng ạ! Có lẽ là vậy anh ạ! Máy em có cài office 2003 bộ cài rút gọn chỉ khoảng 200MB thôi(sau khi cài vào máy). Có lẽ nó bị thiếu 1 số thành phần nào đó nên code báo lỗi chăng?Mình tải file về chạy code thử, không có lỗi gì cả. Có thể máy tính của bạn đang bị gì đó. Không ai bị gì cả, chỉ mình bạn bị thôi.
Từ những câu hỏi của bạn, nhiều người tìm ra nhiều vấn đề và được học hỏi thêm, mình cũng vậy, tuy nhiên bạn tránh spam (như Thầy ptm0412 đã nói).Vâng thực sự là em có chen ngang, nhưng các câu hỏi của em cũng có cùng nội dung của Topic đó chứ ạ! Em cũng chỉ đưa ra các thắc mắc thôi mà.
Nếu các câu hỏi của em đã làm loãng nội dung của topic này thì em xin dừng tại đây ạ!
Có gì mong BQT lượng thứ!
Em mạn phép dùng code của Thầy, sửa một chút nếu bạn chuot0106 có dùng.Tôi đề nghị code bất kỳ, ý nghĩ đầu tiên. Vd. ảnh ở cột B từ dòng 2, số ở cột A từ dòng 2
----------Mã:Sub Rectangle1_Click() Dim Shp As Shape, cell_ As String For Each Shp In ActiveSheet.Shapes cell_ = Shp.TopLeftCell.Address(0, 0) If Left(cell_, 1) = "B" Then Shp.Name = Range(cell_).Offset(, -1).Value Next Shp End Sub
Tất nhiên nên kiểm tra điều kiện chặt hơn đề phòng có những ảnh khác ở cột BA, BB, BC, ...
Sub RenameShape()
Dim Shp As Shape, Tim
For Each Shp In ActiveSheet.Shapes
Set Tim = [A:A].Find(Shp.Name, , , 1)
If Not Tim Is Nothing Then
Shp.Name = Tim.Offset(, 1)
End If
Next Shp
End Sub