anhtuan1066
Thành viên gạo cội




- Tham gia
- 10/3/07
- Bài viết
- 5,802
- Được thích
- 6,912
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim mySel As Range
On Error Resume Next
If Not Intersect(Range("KeyCells"), Target) Is Nothing Then
Set mySel = Selection
ActiveSheet.Shapes(mySel.Address & "Final").Delete
ActiveSheet.Shapes(mySel.Value).Copy
With mySel
.Offset(0, 2).PasteSpecial
Selection.Name = .Address & "Final"
Selection.Left = .Offset(0, 2).Left: Selection.Top = .Offset(0, 2).Top
Selection.Width = .Offset(0, 2).Width: Selection.Height = .Offset(0, 2).Height
End With
End If
mySel.Select
End Sub
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim PicRng As Range, Pos As String
Application.ScreenUpdating = False
On Error Resume Next
If Not Intersect([B5:B8], Target) Is Nothing Then
Set PicRng = Range("G1").CurrentRegion '<--- Dat ten cho vung tra cuu hinh
Pos = WorksheetFunction.VLookup(Target, PicRng, 2, 0) '<--- Xac dinh vi trí chua file hinh tren PC
ActiveSheet.Shapes(Target.Address).Delete '<--- Xoa hinh da dat ten truoc do
With ActiveSheet.Pictures.Insert(Pos) '<--- Chen hinh moi
.Name = Target.Address '<--- Dat ten cho hinh moi chính là dia chi cell
.Left = Target(1, 0).Left: .Top = Target(1, 0).Top '<--- Dinh vi cho hinh
.Width = Target(1, 0).Width: .Height = Target(1, 0).Height '<--- Dinh chieu rong, cao cho hinh
End With
End If
Application.ScreenUpdating = True
End Sub
Anh Tuấn Ơ i ! Cho đứa Em Ngốc Nghếc này hỏi Anh thê m một chút nữa vêề đ oạn code chạy hình trong excel của Anh nhé ;(Set PicRng = Range("G1").CurrentRegion '<--- Dat ten cho vung tra cuu hinh) Anh dặt tê n cho vùng tra cứu hình là G1 vậy Anh vao dau de dat vay.
Them nua ( Pos = WorksheetFunction.VLookup(Target, PicRng, 2, 0) '<--- Xac dinh vi trí chua file hinh tren PC) day la duong dan den file hinh vay Em muon khai bao lai duong dan khac thi vao dau de khai vay Anh. Nho Anh chi dum Em voi nha . cam on Anh that nhieu
Lại tiếp tục cải tiến:
Bỏ luôn mấy hình mẩu (lấy hình dựa vào đường dẩn)PHP:Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim PicRng As Range, Pos As String Application.ScreenUpdating = False On Error Resume Next If Not Intersect([B5:B8], Target) Is Nothing Then Set PicRng = Range("G1").CurrentRegion '<--- Dat ten cho vung tra cuu hinh Pos = WorksheetFunction.VLookup(Target, PicRng, 2, 0) '<--- Xac dinh vi trí chua file hinh tren PC ActiveSheet.Shapes(Target.Address).Delete '<--- Xoa hinh da dat ten truoc do With ActiveSheet.Pictures.Insert(Pos) '<--- Chen hinh moi .Name = Target.Address '<--- Dat ten cho hinh moi chính là dia chi cell .Left = Target(1, 0).Left: .Top = Target(1, 0).Top '<--- Dinh vi cho hinh .Width = Target(1, 0).Width: .Height = Target(1, 0).Height '<--- Dinh chieu rong, cao cho hinh End With End If Application.ScreenUpdating = True End Sub
Các bạn có thể dựa vào file này để làm PicForm (khá đơn giãn)
Các bác pro cho hỏi: trong file của bác Tuấn thì cần phải có địa chỉ của ảnh thì mới Vlookup được. Nếu file ảnh và file excel cùng 1 folder và chuyển folder này từ địa chỉ này qua địa chỉ khác thì phải thay đổi địa chỉ file ở vùng vlookup. Làm thế nào để thay đổi địa chỉ mà không phải update lại địa chỉ?
Khi xưa ta bé ta ngu...
Ngày trước download file này ở các trang nước ngoài về, chỉ đơn giản thấy hay thì đưa lên... giờ xem lại code thấy.. buồn cười (code dài dòng, lúc chạy thì cà giật) ===> đâu cứ code nước ngoài viết là hay
He... he...
Sửa lại đây
File này dùng 3 hình mẫu có sẳn trong sheet, các bạn có thể cải tiến, thậm chí không cần mấy hình mẩu này tôi nghĩ cũng ko có vấn đề (nếu trong máy tính của ta đã có sẳn)PHP:Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim mySel As Range On Error Resume Next If Not Intersect(Range("KeyCells"), Target) Is Nothing Then Set mySel = Selection ActiveSheet.Shapes(mySel.Address & "Final").Delete ActiveSheet.Shapes(mySel.Value).Copy With mySel .Offset(0, 2).PasteSpecial Selection.Name = .Address & "Final" Selection.Left = .Offset(0, 2).Left: Selection.Top = .Offset(0, 2).Top Selection.Width = .Offset(0, 2).Width: Selection.Height = .Offset(0, 2).Height End With End If mySel.Select End Sub
(Record quá trình Insert hình rồi chỉnh lại code)
Bạn cho toàn bộ code này vào sheet nhé:Làm sao để thêm được hình khác theo bài này nữa vậy bạn anhtuan1066
Private Sub Worksheet_Change(ByVal Target As Range)
Dim pic As Picture
On Error Resume Next
If Not Intersect(Range("B5:B10"), Target) Is Nothing Then
If Target.Count = 1 Then
With Target.Parent
.Pictures(Target.Address).Delete
Set pic = .Pictures(Target.Value)
End With
If Not pic Is Nothing Then
pic.Copy
Target.Offset(, 2).PasteSpecial
With Selection
.Name = Target.Address
.ShapeRange.LockAspectRatio = msoFalse
.Left = Target.Offset(, 2).Left: .Top = Target.Offset(, 2).Top
.Width = Target.Offset(, 2).Width: .Height = Target.Offset(, 2).Height
End With
End If
End If
End If
Target.Select
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rCel As Range, pic As Picture, arr(), n As Long
On Error Resume Next
If Not Intersect(Range("B5:B10"), Target) Is Nothing Then
If Target.Count = 1 Then
For Each pic In Target.Parent.Pictures
If Not (pic.Name Like "$*$*") Then
n = n + 1
ReDim Preserve arr(1 To n)
arr(n) = pic.Name
End If
Next
If IsArray(arr) Then
With Target.Validation
.Delete
.Add 3, , , Join(arr, ",")
End With
End If
End If
End If
End Sub
Bạn cho toàn bộ code này vào sheet nhé
Cám ơn thày Anh tuấn ! thày cho hỏi liệu có thể phóng to ảnh lên vài lần khi rê chuột đến được không ? vì như thế dữ liệu dòng và cột chỉ cần nhỏ thôi . Khi cần xem ảnh ta rê chuột vào ảnh được phóng to để cho dễ nhìn .Lại tiếp tục cải tiến:
Bỏ luôn mấy hình mẩu (lấy hình dựa vào đường dẩn)PHP:Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim PicRng As Range, Pos As String Application.ScreenUpdating = False On Error Resume Next If Not Intersect([B5:B8], Target) Is Nothing Then Set PicRng = Range("G1").CurrentRegion '<--- Dat ten cho vung tra cuu hinh Pos = WorksheetFunction.VLookup(Target, PicRng, 2, 0) '<--- Xac dinh vi trí chua file hinh tren PC ActiveSheet.Shapes(Target.Address).Delete '<--- Xoa hinh da dat ten truoc do With ActiveSheet.Pictures.Insert(Pos) '<--- Chen hinh moi .Name = Target.Address '<--- Dat ten cho hinh moi chính là dia chi cell .Left = Target(1, 0).Left: .Top = Target(1, 0).Top '<--- Dinh vi cho hinh .Width = Target(1, 0).Width: .Height = Target(1, 0).Height '<--- Dinh chieu rong, cao cho hinh End With End If Application.ScreenUpdating = True End Sub
Các bạn có thể dựa vào file này để làm PicForm (khá đơn giãn)
Cám ơn thày Anh tuấn ! thày cho hỏi liệu có thể phóng to ảnh lên vài lần khi rê chuột đến được không ? vì như thế dữ liệu dòng và cột chỉ cần nhỏ thôi . Khi cần xem ảnh ta rê chuột vào ảnh được phóng to để cho dễ nhìn .
Chính xác là thế! Nếu không, chẳng lẽ có 2 code sự kiện Change trong cùng 1 sheet sao? Nó báo lỗi liềnThay cho toàn bộ code cũ hả bạn ???
Có lẽ nhà em hỏi chưa chuẩn thì đúng hơn, không phải "Rê chuột" đến , mà là "di chuyển chuột đến" thì hình tự động phóng to, khi chuột di chuyển đến ô khác thì nó trở lại trạng thái cũ . Điều nữa là thày có thể kết hợp lấy hyferlink ảnh tự động luôn thì tốt quá vì hyferlink thủ công , nếu nhiều ảnh thì cũng khá vất. Xin cám ơn thày .Rê chuột vào để phóng to thì khó. Ta có thể thay bằng: Click chuột vào ảnh để phóng to <--- Cái này quá dễ, record macro quá trình thay đổi size hình để có code
Rê chuột đến hay di chuyển chuột đến thì cũng như nhau thôi. Tóm lại: Picture không có sự kiện nàyCó lẽ nhà em hỏi chưa chuẩn thì đúng hơn, không phải "Rê chuột" đến , mà là "di chuyển chuột đến" thì hình tự động phóng to, khi chuột di chuyển đến ô khác thì nó trở lại trạng thái cũ
Hyperlink ảnh tự động nghĩa là sao?Điều nữa là thày có thể kết hợp lấy hyferlink ảnh tự động luôn thì tốt quá vì hyferlink thủ công , nếu nhiều ảnh thì cũng khá vất. Xin cám ơn thày .
Rê chuột đến hay di chuyển chuột đến thì cũng như nhau thôi. Tóm lại: Picture không có sự kiện này
Ta chỉ có thể điều khiển hình phóng to, thu nhỏ khi ta dùng chuột CLICK VÀO HÌNH thôi
***
Xin lỗi thày, vì link của ảnh mầu xanh nên nhà em tưởng phải Hyperlink đến file ảnh . Nói để diến đạt chính xác thật khó, nhà em đính kèm tập tin nhờ thày giúp . code phóng to, thu nhỏ nhà em làm rồi, nó hoạt động tốt, nhưng nhà em loay hoay mãi để nó tự động thực hiện khi di chuyển chuột đến các ô có chứa địa chỉ ảnh mà không được. Mong thày xem giúp vì nhà em trình độ VBA kiểu ăn đong nên khó quá . Không phải ta cần sự kiện của ảnh mà là của cell thày ạ, tức là sự kiện để chạy 2 sub trên,làm sao để đia chỉ trong code thay đổi theo chuột là được . Không biết ý tưởng của nhà em thế có được không nữa ? Nghe có vẻ kỳ kỳ , mong thay xem giúp và hồi âm . Biết thày không thích gọi là "Thày", nhưng 1 ngày là thày mà 1 chữ cũng là thày mà . Vả lại học thày bao nhiêu là chữ .