Đố vui về VBA!

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,905
Nhằm cũng cố kiến thức về VBA cho các bạn mới bắt đầu và cả những bạn đang ứng dụng mà chưa hiểu nhiều về nó, tôi mở topic này với mong mõi qua những câu hỏi vui, các bạn sẽ nhận định lại sự hiểu biết cũa mình... (Kễ cã chính tôi cũng đang tập tành nên có rất nhiều cái chưa biết)
Mong rằng topic sẽ mang đến cho các bạn những khám phá thú vị với những cái tưỡng chừng như đã biết
Mong nhận dc bài viết về câu đố cũa các cao thủ! Còn các bạn mới thì đừng ngại khi đưa ra ý kiến cũa mình.. Có sai có sữa sẽ hoàn thiện!
Tôi xin mỡ màn trước bằng 1 câu hỏi đơn giãn
ANH TUẤN

CÂU HỎI 1: Tại sao biến K ko hoạt động?
Tôi muốn khi nhấn vào 1 button thì cell A1 sẽ tăng lên 1 đơn vị... Tôi đã làm như sau:
-Tạo 1 Command Button (nút nhấn thuộc thanh Control Toolbox), click phải chuột lên nút nhấn, chọn View code, rồi gõ vào đoạn code sau:
PHP:
Private Sub CommandButton1_Click()
   K = K + 1
   Range("A1").Value = K
End Sub
Ban đầu K chưa có gì, xem như =0, nhấn nút lần thứ nhất thì K dc tăng thêm 1, vậy K hiện tại sẽ bằng 1, và gán K vào cell A1 thì đương nhiên A1 sẽ =1... Nhấn nút lần 2, K lại dc tăng thêm 1 nên hiện tại K sẽ =2 và cell A1 cũng sẽ =2... vân vân.. từ đó diễn tiến tiếp...
Hi.. hi.. Điều này nghe qua có vẽ rất hợp lý, ấy thế mà khi nhấn nút nó chỉ hoạt động dc duy nhất 1 lần (A1 = 1) rồi thôi ko nhút nhít nữa...
Các bạn có thể giãi thích tại sao lại như thế ko? Tại sao những lần nhấn nút sau đó K lại ko tăng thêm tí nào (vì thực tế A1 vẫn cứ = 1 hoài) ?
ANH TUẤN
 
OK, đây là một đáp án, khi chọn chế độ này nó sẽ không xảy ra sự kiện click.

Thử tìm tiếp xem nó còn cái nào nữa không ta?

Mã:
Private Sub CommandButton1_Click()


ListBox1.ListIndex = 0
ListBox1.ListIndex = -1


End Sub

Và vẫn còn 1 cái khác nữa , chờ Nghĩa đẹp chai tìm giúp , ha ha +-+-+-++-+-+-++-+-+-+
 
Upvote 0
Đã có 2 đáp án rồi đến anh Nghĩa đẹp zai xuất chiêu đi.
 
Upvote 0
Copy FillColor từ vùng này sang vùng khác

Đầu tiên mời các bạn xem qua topic này:
http://www.giaiphapexcel.com/forum/...aste-màu-nền-của-cell-này-qua-cell-khác-đc-ko
Ở đó người ta muốn copy màu của một vùng nhiều cell (đã được tô nhiều màu) sang vùng khác
Vấn đề khá đơn giản nhưng nếu tôi muốn tăng độ khó của bài toán lên bằng cách giả định rằng có vài cell trong vùng nguồn đã được tô màu bằng CF thì sao? Tức copy toàn bộ màu mà ta nhìn thấy (bất kể được tô bằng cách nào) từ vùng này sang vùng khác
Lâu rồi không thấy ai "náo loạn" topic này hen...
 
Upvote 0
Đầu tiên mời các bạn xem qua topic này:
http://www.giaiphapexcel.com/forum/...aste-màu-nền-của-cell-này-qua-cell-khác-đc-ko
Ở đó người ta muốn copy màu của một vùng nhiều cell (đã được tô nhiều màu) sang vùng khác
Vấn đề khá đơn giản nhưng nếu tôi muốn tăng độ khó của bài toán lên bằng cách giả định rằng có vài cell trong vùng nguồn đã được tô màu bằng CF thì sao? Tức copy toàn bộ màu mà ta nhìn thấy (bất kể được tô bằng cách nào) từ vùng này sang vùng khác
Lâu rồi không thấy ai "náo loạn" topic này hen...

Có giới hạn phiên bản Excel không anh :)
 
Upvote 0
Có giới hạn phiên bản Excel không anh :)

Phiên bản nào tùy bạn! Chấp nhận luôn trường hợp phiên bản cao làm được mà phiên bản trước đó bó tay
---------------------------
Ai chà! Nghe kiểu hỏi thì chắc đã có câu trả lời rồi nhỉ
 
Upvote 0
Phiên bản nào tùy bạn! Chấp nhận luôn trường hợp phiên bản cao làm được mà phiên bản trước đó bó tay
---------------------------
Ai chà! Nghe kiểu hỏi thì chắc đã có câu trả lời rồi nhỉ
Excel 2010 trở lên thì có thể dùng cái này
PHP:
Range.DisplayFormat...
 
Upvote 0
Lâu lâu đào lên cái cho vui
Đố các bạn làm sao gọi được hàm LoadPicture với đường dẫn chứa tiếng Việt có dấu ?
Mã:
Image1.Picture = [COLOR=#ff0000][B]LoadPicture[/B][/COLOR](filename)
Lưu ý nhỏ : không sử dụng các thư viện Window API --=0--=0
 

File đính kèm

  • Load Image.rar
    33.3 KB · Đọc: 24
Upvote 0
Lâu lâu đào lên cái cho vui
Đố các bạn làm sao gọi được hàm LoadPicture với đường dẫn chứa tiếng Việt có dấu ?
Mã:
Image1.Picture = [COLOR=#ff0000][B]LoadPicture[/B][/COLOR](filename)
Lưu ý nhỏ : không sử dụng các thư viện Window API --=0--=0

Bai này Mạnh sẻ sử dung Fso lấy ShortPath của nó là ok ko phải API cái quái gì hết ....Nói vậy chơi mai mốt Viết hahahahaha


3 dòng code thay cho một mớ API + Hàm sau
Mã:
Function ShortFileName(ByVal LongFileName As String) As String
    Dim buffer As String
    buffer = String(256, Chr(0))
    GetShortPathName StrPtr(LongFileName), StrPtr(buffer), 256
    ShortFileName = buffer
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Bài này Thầy Siwtom đã làm rồi .
 
Upvote 0
Code này là thư viện Window API hả Anh kieu manh:
Mã:
#If VBA7 Then
Private Declare PtrSafe Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#Else
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#End If


Private index As Long


Function ShortFileName(ByVal LongFileName As String) As String
Dim buffer As String
    buffer = String(256, Chr(0))
    GetShortPathName StrPtr(LongFileName), StrPtr(buffer), 256
    ShortFileName = buffer
End Function


Private Sub CommandButton1_Click()
Dim filename As String
    index = (index Mod 2) + 1
    filename = ShortFileName(ThisWorkbook.Path & "\images\" & index & ".jpg")
    Image1.Picture = LoadPicture(filename)
End Sub
 
Upvote 0
Code này là thư viện Window API hả Anh kieu manh:
Mã:
[COLOR=#ff0000]#If VBA7 Then
Private Declare PtrSafe Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#Else
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#End If
[/COLOR]

Private index As Long


[COLOR=#ff0000]Function ShortFileName(ByVal LongFileName As String) As String
Dim buffer As String
    buffer = String(256, Chr(0))
    GetShortPathName StrPtr(LongFileName), StrPtr(buffer), 256
    ShortFileName = buffer
End Function
[/COLOR]

Private Sub CommandButton1_Click()
Dim filename As String
    index = (index Mod 2) + 1
    filename = ShortFileName(ThisWorkbook.Path & "\images\" & index & ".jpg")
    Image1.Picture = LoadPicture(filename)
End Sub

Thì nó đó ...ý Bài #1167 là bỏ hết code màu đỏ đó
 
Upvote 0
Bai này Mạnh sẻ sử dung Fso lấy ShortPath của nó là ok ko phải API cái quái gì hết ....Nói vậy chơi mai mốt Viết hahahahaha


3 dòng code thay cho một mớ API + Hàm sau
Mã:
Function ShortFileName(ByVal LongFileName As String) As String
    Dim buffer As String
    buffer = String(256, Chr(0))
    GetShortPathName StrPtr(LongFileName), StrPtr(buffer), 256
    ShortFileName = buffer
End Function

filename = FSO.GetFile(filename).ShortPath là cách tốt nhất rồi đấy
 
Upvote 0
Code này là thư viện Window API hả Anh kieu manh:
Mã:
#If VBA7 Then
Private Declare PtrSafe Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#Else
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#End If


Private index As Long


Function ShortFileName(ByVal LongFileName As String) As String
Dim buffer As String
    buffer = String(256, Chr(0))
    GetShortPathName StrPtr(LongFileName), StrPtr(buffer), 256
    ShortFileName = buffer
End Function


Private Sub CommandButton1_Click()
Dim filename As String
    index = (index Mod 2) + 1
    filename = ShortFileName(ThisWorkbook.Path & "\images\" & index & ".jpg")
    Image1.Picture = LoadPicture(filename)
End Sub

Hỉnh như cái này là API thì phải
#If VBA7 Then
Private Declare PtrSafe Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#Else
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#End If
 
Upvote 0
filename = FSO.GetFile(filename).ShortPath là cách tốt nhất rồi đấy

vâng đó chính là cái em muốn lưu trữ lại để xài sau này .
Tánh em hay quên , lại chưa được "nhậu" với anh NDU cách tìm kiếm bài viết trên GPE nên kiếm cớ hỏi đặng có cái lưu trữ . Thông cảm cho em nha anh NDU . +-+-+-++-+-+-+
 
Upvote 0
filename = FSO.GetFile(filename).ShortPath là cách tốt nhất rồi đấy

đúng đó Anh ...nếu Em viết cho Một Sub thì Em Set 1 cái Fso là xong ...

Còn trong một dự Án VB thì Em lại thích viết ra 1 hàm và xài nó cho vài cái khác nữa chẳng Hạn ...
đáp án của Em
Mã:
Private Function GetShortPath(ByVal FilePath As String)
    With CreateObject("Scripting.FileSystemObject")
        GetShortPath = .GetFile(FilePath).ShortPath
    End With
End Function

Private Sub CommandButton1_Click()
    Dim filename As String
    index = (index Mod 2) + 1
    filename = GetShortPath(ThisWorkbook.path & "\images\" & index & ".jpg")
    Image1.Picture = LoadPicture(filename)
End Sub
 
Upvote 0
vâng đó chính là cái em muốn lưu trữ lại để xài sau này .
Tánh em hay quên , lại chưa được "nhậu" với anh NDU cách tìm kiếm bài viết trên GPE nên kiếm cớ hỏi đặng có cái lưu trữ . Thông cảm cho em nha anh NDU . +-+-+-++-+-+-+

Giỡn chơi không! Thấy cái "mẹt" bao giờ đâu mà đòi "nhậu". Ngon thì hứa và hẹn đi --=0
-----------------------------------------------
đúng đó Anh ...nếu Em viết cho Một Sub thì Em Set 1 cái Fso là xong ...

Còn trong một dự Án VB thì Em lại thích viết ra 1 hàm và xài nó cho vài cái khác nữa chẳng Hạn ...
đáp án của Em
Mã:
Private Function GetShortPath(ByVal FilePath As String)
    With CreateObject("Scripting.FileSystemObject")
        GetShortPath = .GetFile(FilePath).ShortPath
    End With
End Function
DỰ ÁN LỚN thì đừng có With.. End With. Tiếc gì mà không Set FSO = CreateObject("Scripting.FileSystemObject") rồi sau đó Set FSO = Nothing
Nói chung đã DỰ ÁN LỚN thì đừng cố viết code cho ngắn mà nên viết rõ ràng
Ai biết đâu tại sao nhưng thấy "người lớn" người ta khuyên làm vậy nên mình "người bé" cứ học theo, mai này "lớn" được bằng người sẽ tính
Ẹc... Ẹc...
 
Upvote 0
Dự án lớn thì các hàm viết nên khai báo kiểu trả về của hàm. Không nên buộc ngừoi dùng phải dựa vào tên hàm để đoán kiểu trả về.

Cái này sẽ giúp cho intellisense dễ đọc hơn.

Vả lại, nối object chỉ 1 dòng thì With làm chi cho mệt. Cứ nối thẳng luôn.
myPath = CreateOjbect(...).Get...
 
Lần chỉnh sửa cuối:
Upvote 0
Dự án lớn thì các hàm viết nên khai báo kiểu trả về của hàm. Không nên buộc ngừoi dùng phải dựa vào tên hàm để đoán kiểu trả về.

Cái này sẽ giúp cho intellisense dễ đọc hơn.

Vả lại, nối object chỉ 1 dòng thì With làm chi cho mệt. Cứ nối thẳng luôn.
myPath = CreateOjbect(...).Get...
Phải chăng ý Bạn là Vầy ...
Mã:
Private Function GetShortPath(FilePath)
    GetShortPath = CreateObject("Scripting.FileSystemObject").GetFile(FilePath).ShortPath
End Function

Sub Main()
    Dim path As String
    path = ThisWorkbook.path & "\1.xlsx"
    MsgBox GetShortPath(path)
End Sub
 
Upvote 0
Bai này Mạnh sẻ sử dung Fso lấy ShortPath của nó là ok ko phải API cái quái gì hết ....
Chỉ ăn tục nói phét là giỏi.
Hay theo dõi xem ta nói có lý không nhé.
Có rất nhiều vấn đề trong cuộc sống mà không ai biết cách giải quyết cho đến tận khi có người chỉ ra. Lúc đó mọi người mới ồ lên: quá đơn giản, quá dễ hiểu, quá hiển nhiên. Nhưng xin nói là chỉ khi có người chỉ ra thì mới thấy "quá đơn giản, quá dễ hiểu, quá hiển nhiên". Khi có người đưa ra ý tưởng rồi thì ai cũng nói phét được.
Vấn đề load ảnh vào Image mà đường dẫn có ký tự Việt có đã bao lâu? Người ta dùng Webbrowser để thay thế Image đã bao lâu? Với Image trên sheet thì bó tay. Suốt thời gian đó có ai mạnh mồm như lúc này không?
Vấn đề không phải là "ai đó biết là có tồn tại hàm GetShortPathName hay ... ShortPath" mà vấn đề ở chỗ "có hay không có Ý TƯỞNG dùng chúng để giải quyết vấn đề". Có người có cả một kho công cụ để làm các việc nhưng có những việc bó tay. Chỉ khi có người chỉ ra hướng đi thì mới "ừ nhỉ, mình cũng có trong kho".

Nói phét thì ai chả nói được. Cái quan trọng là khoảng thời gian mà mọi người bó tay kia. Không ai có ý tưởng dùng cái mà bây giờ lớn tiếng nói phét.

Trong lập trình thì tư duy là quan trọng nhất. Dù công thức hay code thì tư duy vẫn có vai trò quyết định. Từ tư duy sẽ có ý tưởng.

Có thể học mót GetShortPathName hay ... ShortPath và những hàm khác nhưng không có ý tưởng thì lần thứ 2 sẽ lại bó tay ngồi đợi ông chohom khác nào đó để rồi sau đó lại lớn tiếng nói phét.
 
Upvote 0
Web KT
Back
Top Bottom