Đố 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,911
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
 
Đồng chí này chơi ăn gian quá
Đã nói không vẽ ra trên bảng tính, giờ lại vẽ lên UserForm, cũng như không (bài 634 đã nói rồi mà)
---------------------
Gợi ý cho bạn 1 cách: Ghi mảng ấy vào 1 file Txt, xong đọc file txt và gán vào bảng tính (sẽ không cần vòng lập)
Tuy nhiên đây cũng chưa phải là cách hay (còn cách khác hay hơn)

Hahaha, tại Thầy nói không cho vẽ trên sheet chứ đâu có cho nói không được vẽ trên form đâu! hahahaha
 
Upvote 0
Hahaha, tại Thầy nói không cho vẽ trên sheet chứ đâu có cho nói không được vẽ trên form đâu! hahahaha

Nói chung là: Cái chiêu gán array vào combobox rồi lấy ngược trở về người ta đã làm rồi, giờ mình làm lại thì còn gì là bí mật và độc đáo nữa
 
Upvote 0
Xin hỏi:Có cách nào có thể gán mảng 1 chiều 6 phần tử kia xuống A1:A6 mà không cần đến vòng lập hay Transpose không?
Hi Anh
[GPECODE=vb]Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True[/GPECODE]
Có dùng cái này được không anh.

Lê Văn Duyệt
 
Upvote 0
Vì trong đoạn code đó có Transpose. Vậy nếu dùng cái này thì được hả anh?

Lê Văn Duyệt

Câu đố là có 1 mảng 1 chiều cho trước, bằng cách nào chuyển thành hoặc như mảng 2 chiều mà không dùng vòng lặp, không dùng Transpose.
 
Upvote 0
Vì trong đoạn code đó có Transpose. Vậy nếu dùng cái này thì được hả anh?

Lê Văn Duyệt

Ý mình muốn nói rằng:
- Đầu tiên ta có arr = Array("Giai", "phap", "Excel", "cong cu", "tuyet voi", "cua ban") (đầu vào)
-
Tiếp theo Duyệt lại dùng PasteSpecial gì gì đó
Vậy nên mình thắc mắc rằng: Ta chưa copy cái gì cả thì lấy cái gì để paste đây?
Nhưng nếu Duyệt nghĩ là được thì thử xem
 
Upvote 0
Nếu được dùng kiểu đó thì:
[GPECODE=vb]
arr1 = Array("Giai", "phap", "Excel", "cong cu", "tuyet voi", "cua ban")
Dim rngSource As Range
Set rngSource = Range("B1")
rngSource .Resize(1, UBound(arr1, 1)).Value = arr1 ' Đưa các giá trị của mảng vào hàng từ vị trí B1
rngSource .Resize(1, UBound(arr1, 1)).Copy 'Copy
Range("A1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True 'Đưa các giá trị ra từ vị trí A1
[/GPECODE]

dovuivba_zps58cf0b97.jpg


Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu được dùng kiểu đó thì:
[GPECODE=vb]
arr1 = Array("Giai", "phap", "Excel", "cong cu", "tuyet voi", "cua ban")
Dim rngSource As Range
Set rngSource = Range("B1")
rngSource .Resize(1, UBound(arr1, 1)).Value = arr1 ' Đưa các giá trị của mảng vào hàng từ vị trí B1
rngSource .Resize(1, UBound(arr1, 1)).Copy 'Copy
Range("A1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True 'Đưa các giá trị ra từ vị trí A1
[/GPECODE]

Lê Văn Duyệt

Ẹc... Ẹc... xem như cũng là 1 cách hay!
 
Upvote 0
Có thưởng không Bác.

Lê Văn Duyệt

Có gì đâu mà thường với không thường. Mình nói "Đây cũng là cách hay!" vì mình thật sự chưa nghĩ ra cách này (để loại trừ)
Mọi giải pháp, miễn ra đúng kết quả đều được chấp nhận
Xem như mình chấp nhận giải phảp của Duyệt đi nhưng mà mình còn 1 cách khác nữa, gần gần giống với gợi ý của bài 640
Các bạn suy nghĩ tiếp xem
 
Upvote 0
Có gì đâu mà thường với không thường. Mình nói "Đây cũng là cách hay!" vì mình thật sự chưa nghĩ ra cách này (để loại trừ)
Mọi giải pháp, miễn ra đúng kết quả đều được chấp nhận
Xem như mình chấp nhận giải phảp của Duyệt đi nhưng mà mình còn 1 cách khác nữa, gần gần giống với gợi ý của bài 640
Các bạn suy nghĩ tiếp xem
Nói vậy thì không vẽ ra, chỉ việc tạo object mà dùng thôi, xem như xong rồi còn gì Bác? Tại vì em cứ tưởng Bác không cho dùng cách này.
Ẹc ẹc...

Lê Văn Duyệt
 
Upvote 0
[GPECODE=vb]Sub test()Dim Narr()
Narr = Array("Giai", "phap", "Excel", "cong cu", "tuyet voi", "cua ban")
[a1:a6] = Application.Transpose(Narr())
End Sub


[/GPECODE]
Hi Anh
[GPECODE=vb]Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True[/GPECODE]
Có dùng cái này được không anh.

Lê Văn Duyệt
tiêu đề ko co transpose, nếu được dùng transpose thì đâu cần gì lôi thôi nữa
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy thì nghĩ cách khác đi (dù sao đáp án của mình vẫn chưa mở)
vậy tạm xài cách cùi chuối này được ko ạ!
[GPECODE=vb]Option Explicit

Sub test()
Dim Narr()
Narr = Array("Giai", "phap", "Excel", "cong cu", "tuyet voi", "cua ban")
[b1].Resize(1, 6) = Narr()
Names.Add Name:="Chuyen", RefersTo:=[b1:g1]
[s1:s6].FormulaArray = "=Index(Chuyen, 1, Row())"
[s1:s6].Copy
[a1].PasteSpecial Paste:=xlPasteValues
[b1:g1].Clear
[s1:s6].Clear


End Sub[/GPECODE]
 

File đính kèm

  • test.xls
    34 KB · Đọc: 10
Upvote 0
vậy tạm xài cách cùi chuối này được ko ạ!
[GPECODE=vb]Option Explicit

Sub test()
Dim Narr()
Narr = Array("Giai", "phap", "Excel", "cong cu", "tuyet voi", "cua ban")
[b1].Resize(1, 6) = Narr()
Names.Add Name:="Chuyen", RefersTo:=[b1:g1]
[s1:s6].FormulaArray = "=Index(Chuyen, 1, Row())"
[s1:s6].Copy
[a1].PasteSpecial Paste:=xlPasteValues
[b1:g1].Clear
[s1:s6].Clear


End Sub[/GPECODE]

Nói cho cùng thì cách này cũng gần giống với cách của Lê Văn Duyệt đã làm: "Mượn bảng tính làm nơi tạm trú"
Nghĩ cách khác thôi!
------------
Đương nhiên giải thuật vẫn sẽ là: Mượn cái gì đó làm nơi tạm trú, xong lấy ngược trở ra
Vấn đề: cái gì đó là cái gì sao cho nó... hay hay chút (ảo ảo chút) ---> Đến mức không nhìn thấy bằng mắt thường được
 
Lần chỉnh sửa cuối:
Upvote 0
"Cái gì đó" có thể là cái listbox chăng?
 
Upvote 0
Cách củ chuối vậy:
[GPECODE=vb]
Dim arrSource As Variant
Dim arrAfterTranspose As Variant

arrSource = Array("Giai", "phap", "Excel", "cong cu", "tuyet voi", "cua ban")
Range("C1").Resize(1, UBound(arrSource, 1) + 1).Value = arrSource 'Đưa mảng trên ra tại ô C1 theo chiều ngang
With Range("A1:A" & (UBound(arrSource, 1) + 1))
.Formula = "=ROW()-1" ' Chỉ là công thức phụ
End With
With Range("B1:B" & (UBound(arrSource, 1) + 1))
.FormulaR1C1 = "=OFFSET(R1C3,0," & "RC[-1])" 'Công thức để lấy các giá trị của mảng đã đưa ra tại C1
End With
arrAfterTranspose = Range("B1").Resize(UBound(arrSource, 1) + 1, 1) 'Đưa các giá trị vào mảng
Range("A1").Resize(UBound(arrSource, 1) + 1, 1) = arrAfterTranspose 'Đưa mảng ra tại ô A1 theo chiều dọc
[/GPECODE]

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Upvote 0
Em cũng tham gia 1 cách: Không vòng lặp, không Transpose
Mã:
Sub Test()
    Dim Str As String
    Dim Arr
    Arr = Array("Giai", "phap", "Excel", "cong cu", "tuyet voi", "cua ban")
    Str = """" & VBA.Join(Arr, """;""") & """"
    Range("A1").Resize(UBound(Arr), 1).FormulaArray = "=INDEX({" & Str & "},ROW())"
End Sub
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom