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
Họ gọi người thuê thôi ! và đặc biệt là họ thấy thế là bình thường . chẳng khác gì tài liệu tiếng nước ngoài: thuê dịch, thế là xong . Không làm được thì thuê ! thật là đơn giản . Do thày làm với người nước ngoài nhiều nên thấy "chướng" chứ nhiều người cả đời không quan hệ với đối tác là người nước ngoài, trừ khi dùng tiền "chùa" đi du lịch thì đã có phiên dịch thì họ lo gì . OK mà thày . Cái đáng sợ là họ thấy đó là điều tất nhiên !
Vâng , cám ơn thày ! Nhà em cũng vậy, cái gì bây giờ chưa làm được thì sau này có điều kiện lại làm . Có việc mấy năm sau tự nhiên sực nhớ đến, khi làm được rồi , lắm lúc ngồi cười một mình . Thực ra cái này Thày Nghĩa tìm ra cái lỗi cơ bản rồi , chắc chạy trên Excel 2003 nên nó hơi chậm, Có khi nhà em tả có thể thày cũng biết nó lỗi cái gì : Tức là có lúc nếu nó xóa được ảnh khi ta kích vào sau khi phóng to, thi nó chạy tiếp bình thường . Còn không nó phóng to liên tiếp các ảnh khác khi ta kích vào và không thu nhỏ được nữa . Bây giờ sử lý được cái đó thì toàn bộ list và tên của ảnh nó không xuất hiện tại cột B nữa . Thực ra nhà em cũng muốn học các thày sử lý xem nó bị lỗi gì ? Ít ra ta cũng biết không phải lúc nào khi sử dụng Excel 2010 để ghi thành đuôi xls nó cũng chạy bình thường . Nếu lúc nào thày tìm ra lỗi,thày nhớ giúp nhà em với ! Hiện tại nhà em cứ làm trên Excel 2010 đã , khi có ai kêu nhà em tính sau . Xin cám ơn về sự uyên bác, xin cám ơn về sự tận tụy, xin cám ơn về sự nhiệt tình của thày .Tính mình rất hiếu kỳ. Mỗi khi gặp 1 vấn đề hơi "lạ lạ" là phải nhất định tìm hiểu tận gốc mới thôi
Trường hợp của bạn mình suy nghĩ mãi cũng không thấy có vấn đề gì. Ngoại trừ dòng lệnh LockAspectRatio = msoFalse không dùng được trên Excel 2003 thì các code còn lại là hoàn toàn tương thích
Tuy nhiên, để chắc ăn thì phải test trực tiếp... Cũng đã cố tìm máy nào đó có Office 2003 mà đành.. bó bột thôi
Ẹc... Ẹc... Tóm lại là: thua
(Để vài bữa hỏi thử xem ai có bộ Potable Office có hổ trợ VBA sẽ tính tiếp)
Vâng , cám ơn thày ! Nhà em cũng vậy, cái gì bây giờ chưa làm được thì sau này có điều kiện lại làm . Có việc mấy năm sau tự nhiên sực nhớ đến, khi làm được rồi , lắm lúc ngồi cười một mình . Thực ra cái này Thày Nghĩa tìm ra cái lỗi cơ bản rồi , chắc chạy trên Excel 2003 nên nó hơi chậm, Có khi nhà em tả có thể thày cũng biết nó lỗi cái gì : Tức là có lúc nếu nó xóa được ảnh khi ta kích vào sau khi phóng to, thi nó chạy tiếp bình thường . Còn không nó phóng to liên tiếp các ảnh khác khi ta kích vào và không thu nhỏ được nữa . Bây giờ sử lý được cái đó thì toàn bộ list và tên của ảnh nó không xuất hiện tại cột B nữa . Thực ra nhà em cũng muốn học các thày sử lý xem nó bị lỗi gì ? Ít ra ta cũng biết không phải lúc nào khi sử dụng Excel 2010 để ghi thành đuôi xls nó cũng chạy bình thường . Nếu lúc nào thày tìm ra lỗi,thày nhớ giúp nhà em với ! Hiện tại nhà em cứ làm trên Excel 2010 đã , khi có ai kêu nhà em tính sau . Xin cám ơn về sự uyên bác, xin cám ơn về sự tận tụy, xin cám ơn về sự nhiệt tình của thày .
InsertPic PicPath, Target, "ShpResize" <-- ([B][COLOR=#ff0000]A[/COLOR][/B])
Set Target = Range("A5").Offset(lR)
lR = lR + 1
Set Target = Range("A5").Offset(lR)
lR = lR + 1
InsertPic PicPath, Target, "ShpResize"
If bMark = False Then
.ScaleWidth 5, msoFalse, msoScaleFromMiddle
...
.AlternativeText = "TRUE"
Else
.AlternativeText = ""
End If
[COLOR=#ff0000]If bMark Then[/COLOR]
.ScaleWidth 5, msoFalse, msoScaleFromMiddle
...
[COLOR=#ff0000].AlternativeText = ""[/COLOR]
Else
[COLOR=#ff0000].AlternativeText = "TRUE"[/COLOR]
End If
Chổ này thì đúng. Em sơ sótTóm lại nếu trong folder có 1 ảnh thì không có ảnh nào được load. Nếu có n ảnh thì chỉ có (n - 1) ảnh được load. Để khắc phục thì đổi thành
Mã:Set Target = Range("A5").Offset(lR) lR = lR + 1 InsertPic PicPath, Target, "ShpResize"
Theo lôgic thì click lần đầu tiên vào ảnh thì ảnh phải phóng to vì ảnh hiện thời đang nhỏ. Nhưng với code hiện thời thì phải click lần thứ 2 thì ảnh mới to. Tức với mỗi ảnh ta tốn 1 click vô ích. Để khắc phục thì đổi code trong ShpResize
Mã:If bMark = False Then .ScaleWidth 5, msoFalse, msoScaleFromMiddle ... .AlternativeText = "TRUE" Else .AlternativeText = "" End If
thành
Mã:[COLOR=#ff0000]If bMark Then[/COLOR] .ScaleWidth 5, msoFalse, msoScaleFromMiddle ... [COLOR=#ff0000].AlternativeText = ""[/COLOR] Else [COLOR=#ff0000].AlternativeText = "TRUE"[/COLOR] End If
Sub ShpResize()
Dim pic As Picture
Dim bMark As Boolean
On Error Resume Next
Set pic = Sheet1.Pictures(Application.Caller)
With pic.ShapeRange
[COLOR=#ff0000]bMark = (Len(.AlternativeText) > 0)[/COLOR]
[COLOR=#ff0000]If bMark = False Then[/COLOR]
.ScaleWidth 3, msoFalse, msoScaleFromMiddle
.ScaleHeight 3, msoFalse, msoScaleFromMiddle
.AlternativeText = "TRUE"
.ZOrder msoBringToFront
Else
.Left = Range(.Name).Left: .Top = Range(.Name).Top
.Width = Range(.Name).Width: .Height = Range(.Name).Height
.AlternativeText = vbNullString
End If
End With
End Sub
Chổ này thì đúng. Em sơ sót
Nhưng chổ này
Thì em nghĩ là sai! Lúc đầu AlternativeText chưa có gì, mà bMark = (Len(.AlternativeText) > 0) nên bMark sẽ =FALSE
Vậy nên xét điều kiện khi bMark=FALSE mới phóng to ảnh là chính xác rồi còn gì
Nếu sửa như anh thì click vào chẳng có chuyện gì xãy ra cả
Toàn bộ code của em viết là thế này:
Có khi anh đang nói đến code nào đó đã bị "độ" lại cũng không chừngMã:Sub ShpResize() Dim pic As Picture Dim bMark As Boolean On Error Resume Next Set pic = Sheet1.Pictures(Application.Caller) With pic.ShapeRange [COLOR=#ff0000]bMark = (Len(.AlternativeText) > 0)[/COLOR] [COLOR=#ff0000]If bMark = False Then[/COLOR] .ScaleWidth 3, msoFalse, msoScaleFromMiddle .ScaleHeight 3, msoFalse, msoScaleFromMiddle .AlternativeText = "TRUE" .ZOrder msoBringToFront Else .Left = Range(.Name).Left: .Top = Range(.Name).Top .Width = Range(.Name).Width: .Height = Range(.Name).Height .AlternativeText = vbNullString End If End With End Sub
Tôi viết rất rõ mà: "Trước hết góp ý về code trong bài #35 và #43"
Ở lần click đầu tiên thì .AlternativeText = "tên ảnh", tức bMark = TRUE
Anh xem kỹ lại đi: Cả code ở bài 35 và 43 đều không có cái vụ .AlternativeText = "tên ảnh" đâuỞ lần click đầu tiên thì .AlternativeText = "tên ảnh", tức bMark = TRUE
Sub ShpResize()
Dim pic As Picture
Dim bMark As Boolean
Set pic = Sheet1.Pictures(Application.Caller)
With pic.ShapeRange
[COLOR=#ff0000]bMark = (Len(.AlternativeText) > 0)
If bMark = False Then[/COLOR]
.ScaleWidth 5, msoFalse, msoScaleFromMiddle
.ScaleHeight 5, msoFalse, msoScaleFromMiddle
[COLOR=#ff0000] .AlternativeText = "TRUE"[/COLOR]
.ZOrder msoBringToFront
Else
.Left = Range(.Name).Left: .Top = Range(.Name).Top
.Width = Range(.Name).Width: .Height = Range(.Name).Height
[COLOR=#ff0000].AlternativeText = vbNullString[/COLOR]
End If
End With
End Sub
Sub ShpResize()
Dim pic As Shape
Dim bMark As Boolean
Set pic = ActiveSheet.Shapes(Application.Caller)
With pic
[COLOR=#ff0000] bMark = (Len(.AlternativeText) > 0)
If bMark = False Then[/COLOR]
.ScaleWidth 5, msoFalse, msoScaleFromMiddle
.ScaleHeight 5, msoFalse, msoScaleFromMiddle
[COLOR=#ff0000].AlternativeText = "TRUE"[/COLOR]
.ZOrder msoBringToFront
Else
.Left = Range(.Name).Left: .Top = Range(.Name).Top
.Width = Range(.Name).Width: .Height = Range(.Name).Height
[COLOR=#ff0000] .AlternativeText = ""[/COLOR]
End If
End With
End Sub
Tôi có nói code không êm xuôi đâu. Tôi chỉ nói "phí" 1 lần click đầu tiên sau khi load ảnh.TÁC GIÁ CODE LÀ EM đấy anh à!
Dù là bài 35 hay 36 hay số mấy thì code đó cũng là của em
---------------
Anh xem kỹ lại đi: Cả code ở bài 35 và 43 đều không có cái vụ .AlternativeText = "tên ảnh" đâu
Tất cả 2 code trong 2 bài ấy đều đặt điều kiện vầy: bMark = (Len(.AlternativeText) > 0)
Code bài 35:
Code bài 43:Mã:Sub ShpResize() Dim pic As Picture Dim bMark As Boolean Set pic = Sheet1.Pictures(Application.Caller) With pic.ShapeRange [COLOR=#ff0000]bMark = (Len(.AlternativeText) > 0) If bMark = False Then[/COLOR] .ScaleWidth 5, msoFalse, msoScaleFromMiddle .ScaleHeight 5, msoFalse, msoScaleFromMiddle [COLOR=#ff0000] .AlternativeText = "TRUE"[/COLOR] .ZOrder msoBringToFront Else .Left = Range(.Name).Left: .Top = Range(.Name).Top .Width = Range(.Name).Width: .Height = Range(.Name).Height [COLOR=#ff0000].AlternativeText = vbNullString[/COLOR] End If End With End Sub
Còn chuyện có tên ảnh trong AlternativeText thì đó cũng là sơ suất của người ta, chẳng ảnh hưởng gì đến code cả. Dù lần đầu click có trục trặc thì những lần sau vẫn êm xuôiMã:Sub ShpResize() Dim pic As Shape Dim bMark As Boolean Set pic = ActiveSheet.Shapes(Application.Caller) With pic [COLOR=#ff0000] bMark = (Len(.AlternativeText) > 0) If bMark = False Then[/COLOR] .ScaleWidth 5, msoFalse, msoScaleFromMiddle .ScaleHeight 5, msoFalse, msoScaleFromMiddle [COLOR=#ff0000].AlternativeText = "TRUE"[/COLOR] .ZOrder msoBringToFront Else .Left = Range(.Name).Left: .Top = Range(.Name).Top .Width = Range(.Name).Width: .Height = Range(.Name).Height [COLOR=#ff0000] .AlternativeText = ""[/COLOR] End If End With End Sub
Vậy nên phần code này không cần phải sửa gì cả
(File ở bài 35 bị lỗi là vì 1 chuyện hoàn toàn khác, đã xử lý xong)
Tôi có bàn về chuyện lỗi kia đâu???
Mà người góp ý thì cứ góp ý còn việc sửa hay không thì là chuyện của người khác. Chả ai bắt ai đâu mà
Anh góp ý thì em và mọi người đều cảm ơn (chuyện đương nhiên)
----------------------------------------------------
Ngoài lề một chút:
Em biết là anh đã xem qua topic này vài lần, chắc cũng định bỏ đi rồi nhưng vì thấy thằng em nó sai mà không ai phát hiện nên anh ngứa tay vào đây góp vài lời (em rất cảm ơn về điều này)
Em biết là anh ngại giao tiếp với em nên đã "nói tránh" đi là góp ý cho bài này, bài nọ (không phải bài của em)...
Ẹc... Ẹc... dù là bài nào trong topic này cũng có liên quan đến em thôi
Em khộng ngại mà nói thằng rằng: thời gian gần đây em cũng ngại giao tiếp với anh, vì anh hay nỗi nóng bất thường nên sau này em chẳng khi nào góp ý bất cứ vấn đề gì có liên đến code anh viết (anh thừa hiểu lý do vì sao)
Thôi thì đã lỡ vào đây rồi, có góp ý anh cứ góp ý thẳng (không cần phải "nói tránh" đi đâu). Tính em phân biệt rõ ràng lắm, dù có ghét ai đến mấy nhưng vẫn chịu học hỏi nếu người đó có cái hay... huống chi em với anh dù có "tránh mặt" nhau cũng đâu phải thuộc dạng ghét cay ghét đăng hay thù hằn gì
Anh nghĩ em nói đúng không?
----------------------------------------------------
Ôi... mông lung quá!![]()
Vâng! Có sai chứ anh! Đó là trường hợp anh nói về AlternativeTextK
Góp ý? Sẵn sàng, nhưng cứ nói thẳng. Đừng quanh co, bịa tình huống.
Tôi góp ý có cái gì sai không? Nếu sai thì nói ra để tôi rút kinh nghiệm. Còn nếu đúng thì tại sao lại có chuyện "kể" ra những chuyện như trên?
Hình như anh chưa hiểu ý em thì phải (cũng như bao lần trước)Tôi sẽ không viết thêm gì nữa.
-----------------
Tôi đã nói là không viết thêm nữa tức sẽ không có chuyện tranh luận gì ở đây. Vậy đề nghị BQT để nguyên bài này của tôi. Một ý kiến, vài lời giải thích nhưng của người có văn hóa mà. Chuyện nói thẳng vì là toàn là đàn ông mà lại đàn ông có tuổi mà.
Các thày cũng cho nhà em nói thẳng là "một nửa" của ta đáng yêu, đáng quý biết bao nhiêu mà nhiều khi vẫn phải "Quay mặt làm ngơ" mà . Với hai thày vừa là "cao thủ" của GPE cả về kiến thức, cả về tuổi đời và cả về đối nhân sử thế ; Máy móc là "kẻ" vô tri mà còn xung đột mà . Theo nhà em thì " Không có giải nhất" là phương án tối ưu , Mong các thày đừng cho rằng nhà em " nói leo " .
Public aFiles, sFolder As String
Sub ShpResize()
Dim shp As Shape, rngPos As Range
Dim bMark As Boolean
On Error Resume Next
Set shp = ActiveSheet.Shapes(Application.Caller)
With shp
Set rngPos = Range(.Name)
bMark = (Len(.AlternativeText) > 0)
If bMark = False Then
.ScaleWidth 3, msoFalse, msoScaleFromMiddle
.ScaleHeight 3, msoFalse, msoScaleFromMiddle
.AlternativeText = "TRUE"
.ZOrder msoBringToFront
Else
.Left = rngPos.Left: .Top = rngPos.Top
.Width = rngPos.Width: .Height = rngPos.Height
.AlternativeText = ""
End If
End With
End Sub
Sub ShpReset()
Dim shp As Shape, bMark As Boolean, rngPos As Range
On Error Resume Next
For Each shp In ActiveSheet.Shapes
With shp
If .Name Like "$*$*" Then
bMark = (Len(.AlternativeText) > 0)
Set rngPos = Range(.Name)
.Left = rngPos.Left: .Top = rngPos.Top
.Width = rngPos.Width: .Height = rngPos.Height
If bMark Then .AlternativeText = vbNullString
End If
End With
Next
End Sub
Sub SelectFolder()
Dim arr, vFolder, pic
Dim Target As Range, shp As Shape
Dim lR As Long
Dim PicPath As String
On Error Resume Next
vFolder = CreateObject("Shell.Application").BrowseForFolder(0, "", 1).Self.Path
If TypeName(vFolder) = "String" Then
If Right(vFolder, 1) <> "\" Then vFolder = vFolder & "\"
arr = FilesFoldersList(vFolder, True, "*.jpg", False)
If IsArray(arr) Then
aFiles = arr
sFolder = CStr(vFolder)
Range("F1") = sFolder
For Each pic In arr
PicPath = sFolder & CStr(pic)
Set Target = Range("A5").Offset(lR)
lR = lR + 1
Set shp = InsertPic(PicPath, Target, "ShpResize")
Next
Range("F1").Select
End If
End If
End Sub
Function InsertPic(ByVal PicPath As String, ByVal Target As Range, Optional ByVal Action As String = "") As Shape
Dim shp As Shape
On Error Resume Next
With Target
.Parent.Shapes(Target.Address).Delete
Set shp = .Parent.Shapes.AddPicture(PicPath, True, True, .Left, .Top, .Width, .Height)
End With
If Not shp Is Nothing Then
shp.Name = Target.Address
shp.AlternativeText = ""
If Val(Application.Version) > 11 Then shp.LockAspectRatio = msoFalse
shp.OnAction = Action
Set InsertPic = shp
End If
End Function
Đó là vì ngoài code trong Module còn có code sự kiện Change, SelectionChange (nằm trong Sheet). Bạn copy ra file khác nhưng quên không mang theo mấy code này nên phần Validation list không hoạt động. Chú ý nha!Bây giờ sử lý được cái đó thì toàn bộ list và tên của ảnh nó không xuất hiện tại cột B nữa
Khi bạn điều chỉnh kích thước cell xong, chỉ cần click chuột vào 1 cell nào đó là ảnh tự cân chỉnh thôi mà. Tính năng này được thực hiện từ sự kiện SelectionChange:Cám ơn thày ! Code chạy tốt trên Excel 2003 rồi ạ . Song có điều thày giúp nhà em thêm chút nữa là : Tất cả tính năng như File cũ ( Khi điều chỉnh cell ảnh tự động điều chỉnh theo - điều này để điều chỉnh sự cân đối của ảnh )
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
[B][COLOR=#ff0000]ShpReset[/COLOR][/B]
If Not Intersect(Range("B5:B30"), Target) Is Nothing Then
If Target.Count = 1 Then
If IsArray(aFiles) Then
With Target.Validation
.Delete
.Add 3, , , Join(aFiles, ",")
End With
End If
End If
End If
End Sub
Dù phóng to theo tỷ lệ nào thì khi thu nhỏ ảnh cũng về kích thước ban đầu ( Hiện tại ảnh được thu về theo tỷ lệ , nên có lúc nó thu về kích thước nhỏ hơn cell hiện tại, vả lại kích thước ảnh không phải lúc nào cũng giống nhau nên nhà em phải điều chỉnh chiều rộng và chiều dài khác nhau để cân đối ảnh nên khi thu nhỏ rất cần nó trở lại kích thước ban đầu .
!
Sub ShpResize()
Dim shp As Shape, rngPos As Range
Dim bMark As Boolean
On Error Resume Next
Set shp = ActiveSheet.Shapes(Application.Caller)
With shp
Set rngPos = Range(.Name)
bMark = (Len(.AlternativeText) > 0)
If bMark = False Then
.ScaleWidth 3, msoFalse, msoScaleFromMiddle
.ScaleHeight 3, msoFalse, msoScaleFromMiddle
.AlternativeText = "TRUE"
.ZOrder msoBringToFront
Else
[COLOR=#ff0000].Left = rngPos.Left: .Top = rngPos.Top
.Width = rngPos.Width: .Height = rngPos.Height[/COLOR]
.AlternativeText = ""
End If
End With
End Sub
Thưa thày, khi đã load ảnh điều chỉnh cell ảnh không điều chỉnh theo đâu ạ . chỉ khi đổi ảnh nó mới điều chỉnh theo kích thước mới thày ạ .
Cám ơn thày Nhà em gưi file để thày kiểm tra giúp ạ .Bạn đưa file của bạn lên đây xem thử! Tôi test không phát hiện có gì bất thường cả (kích thước ảnh được điều chỉnh ngon lành cho cả 2 trường hợp load ảnh mới và thay đổi ảnh theo validation)
Cám ơn thày Nhà em gưi file để thày kiểm tra giúp ạ .
Function InsertPic(ByVal PicPath As String, ByVal Target As Range, Optional ByVal Action As String = "") As Shape
Dim shp As Shape
On Error Resume Next
With Target
.Parent.Shapes(Target.Address).Delete
Set shp = .Parent.Shapes.AddPicture(PicPath, True, True, .Left, .Top, .Width, .Height)
End With
If Not shp Is Nothing Then
shp.Name = Target.Address
shp.AlternativeText = ""
[COLOR=#ff0000] If Val(Application.Version) > 11 Then shp.LockAspectRatio = msoFalse[/COLOR]
shp.OnAction = Action
End If
End Function
[COLOR=#ff0000] shp.LockAspectRatio = msoFalse[/COLOR]