Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây (1 người xem)

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
- Em xin hỏi đóng file khi đang ở Sheet data thì khi mở form lại thì chạy được, còn đóng file khi ở sheet NTX thì khi mở form lên k chạy được? có phải form phụ thuộc vào thuộc tính nào đó của sheet làm việc sau cùng không ? nhờ các huynh chỉ giáo cảm ơn!!
 
Upvote 0
- Em xin hỏi đóng file khi đang ở Sheet data thì khi mở form lại thì chạy được, còn đóng file khi ở sheet NTX thì khi mở form lên k chạy được? có phải form phụ thuộc vào thuộc tính nào đó của sheet làm việc sau cùng không ? nhờ các huynh chỉ giáo cảm ơn!!
Form show chẳng liên quan gì đến sheet cả, tức đứng ở sheet nào cũng có thể gọi form... Còn bạn bị lỗi thì chỉ bạn mới biết... vì code do bạn viết, có ràng buộc gì đó làm sao mọi người biết được
 
Upvote 0
Form show chẳng liên quan gì đến sheet cả, tức đứng ở sheet nào cũng có thể gọi form... Còn bạn bị lỗi thì chỉ bạn mới biết... vì code do bạn viết, có ràng buộc gì đó làm sao mọi người biết được
- Thì ra nó bị 2 công thức này, khi em muốn tăng dần số tt lấy từ sheet data?
Me.sohh.Value = WorksheetFunction.Max(S104.Range([c2], [C65432].End(xlUp))) + 1
Me.soID.Value = WorksheetFunction.Max(S104.Range([Q2], [Q65432].End(xlUp))) + 1
- Sư phụ chỉ giáo, cám ơn.
 
Upvote 0
- Thì ra nó bị 2 công thức này, khi em muốn tăng dần số tt lấy từ sheet data?
Me.sohh.Value = WorksheetFunction.Max(S104.Range([c2], [C65432].End(xlUp))) + 1
Me.soID.Value = WorksheetFunction.Max(S104.Range([Q2], [Q65432].End(xlUp))) + 1
- Sư phụ chỉ giáo, cám ơn.
Câu lệnh này:
WorksheetFunction.Max(S104.Range([c2], [C65432].End(xlUp))) + 1

WorksheetFunction.Max(S104.Range([Q2], [Q65432].End(xlUp))) + 1
sai hoàn toàn ---> Nó chỉ đúng khi bạn đứng tại sheet S104 mà thôi
Phải vầy mới đúng khi đứng ở bất cứ sheet nào:
WorksheetFunction.Max(S104.Range(S104.[c2], S104.[C65432].End(xlUp))) + 1
và:
WorksheetFunction.Max(S104.Range(S104.[Q2], S104.[Q65432].End(xlUp))) + 1
 
Upvote 0
Câu lệnh này:
WorksheetFunction.Max(S104.Range([c2], [C65432].End(xlUp))) + 1

WorksheetFunction.Max(S104.Range([Q2], [Q65432].End(xlUp))) + 1
sai hoàn toàn ---> Nó chỉ đúng khi bạn đứng tại sheet S104 mà thôi
Phải vầy mới đúng khi đứng ở bất cứ sheet nào:
WorksheetFunction.Max(S104.Range(S104.[c2], S104.[C65432].End(xlUp))) + 1
và:
WorksheetFunction.Max(S104.Range(S104.[Q2], S104.[Q65432].End(xlUp))) + 1
- Cảm ơn sư phụ nhiều, sư phụ bao giờ cũng sẵn lòng giúp đỡ mọi người, thật đáng trân trọng!!
 
Upvote 0
Không xem file nhưng đoán nó là 1 name (vào Define name xem thử)
--------------------------

Code này mà bạn chạy được bình thường kể cũng kỳ... Có rất nhiều dòng khai báo biến trùng nhau, chẳng hạn có 2 dòng Dim Temp$, 2 dòng Dim Msg.. vân vân... nếu chạy chắc chắn sẽ báo lỗi "Duplicate declaration in current scope"
--------------------------
Ngoài ra, nếu không có file thì chẳng biết gì mà giải thích cho bạn
Không fải như vậy thầy ạ nó không nắm trong Define name. Em gửi file lên đây thầy chỉ cho em nhé!
 

File đính kèm

Upvote 0
Không fải như vậy thầy ạ nó không nắm trong Define name. Em gửi file lên đây thầy chỉ cho em nhé!
Tôi làm biếng xử lý những file bị khóa (dù rằng cái khóa của bạn chẳng là cái đinh gì)
Tốt nhất trước khi đưa file lên, hãy bỏ mọi thứ liên quan đến protect đi ---> Nhìn nó chỉ tổ mất cảm tình
 
Upvote 0
Tôi làm biếng xử lý những file bị khóa (dù rằng cái khóa của bạn chẳng là cái đinh gì)
Tốt nhất trước khi đưa file lên, hãy bỏ mọi thứ liên quan đến protect đi ---> Nhìn nó chỉ tổ mất cảm tình
passshet là trắng thầy ạ!
passwoorbok là 123 thầy ạ!
Chỉ cần vào VBA thầy cũng thừa biết mà.
Nếu mà xoá pass đi lại file sửa lại code nên cũng hơi mất thời gian thầy ạ!
 
Upvote 0
Xem hình minh họa để thấy rằng Range("NA") chính là 1 Define Name

untitled.JPG


File của bạn chẳng lẽ bạn không biết? Hoặc đây không phải file của bạn chăng?
 
Upvote 0
Vâng file này không file là do em lập!
Làm thế nào để ẩn hiện được name vậy thầy?
 
Upvote 0
PHP:
Sheets(5).Select
    Application.CommandBars("File").Controls(5).Visible = False
    Application.CommandBars("File").Controls(6).Visible = False
    Application.CommandBars("View").Controls(4).Visible = False
    Application.CommandBars("Tools").Controls(13).Visible = False
    Application.CommandBars("Tools").Controls(14).Visible = False
    Application.CommandBars("Tools").Controls(15).Visible = False
    Application.CommandBars("Tools").Controls(17).Visible = False
    ActiveWindow.DisplayWorkbookTabs = True
Thầy giải thích cho em đoạn này với ạ! em không biết Sheets(5) là sheet nào?
Và các CommandBars trên là cái nào ạ!
 
Upvote 0
PHP:
Sheets(5).Select
    Application.CommandBars("File").Controls(5).Visible = False
    Application.CommandBars("File").Controls(6).Visible = False
    Application.CommandBars("View").Controls(4).Visible = False
    Application.CommandBars("Tools").Controls(13).Visible = False
    Application.CommandBars("Tools").Controls(14).Visible = False
    Application.CommandBars("Tools").Controls(15).Visible = False
    Application.CommandBars("Tools").Controls(17).Visible = False
    ActiveWindow.DisplayWorkbookTabs = True
Thầy giải thích cho em đoạn này với ạ! em không biết Sheets(5) là sheet nào?
Và các CommandBars trên là cái nào ạ!
Code này chỉ hoạt động được trên Excel 2003 mà thôi
Application.CommandBars(" File").Controls(5).Visible = False có nghĩa là ẩn Button thứ 5 trong menu File (nó là nút Save As)
Các câu lệnh khác tương tự
Sheets(5) nghĩa là Sheet thứ 5 tính từ trái sang phải (số 5 là số thứ tự)
 
Upvote 0
T­hưa thầy Sheets(5) nghĩa là Sheet thứ 5 tính từ trái sang phải (số 5 là số thứ tự) có fải tương đuơng với khi mở cửa số VBA nên thì nó tính từ trên xuống dưới vị trí số 5 đúng không thầy? Như vậy theo file đính kèm nó là sheet13 (Name List)?
Sheets(5) khác Sheet5?
 
Upvote 0
T­hưa thầy Sheets(5) nghĩa là Sheet thứ 5 tính từ trái sang phải (số 5 là số thứ tự) có fải tương đuơng với khi mở cửa số VBA nên thì nó tính từ trên xuống dưới vị trí số 5 đúng không thầy? Như vậy theo file đính kèm nó là sheet13 (Name List)?
Sheets(5) khác Sheet5?
Tôi không để ý vụ này... Nói chung là bạn cứ nhìn xuống Sheet tab, đếm từ trái sang phải, sheet nằm ở vị trí số 5 là Sheets(5) (đương nhiên, lúc này các sheet phải đang hiện toàn bộ)
Điều này có nghĩa là nếu bạn đổi chổ vị trí các sheet (bằng cách dùng chuột nắm kéo thả) thì Sheets(5) mới có thể không phải là Sheet(5) của lúc trước
 
Upvote 0
PHP:
      Case 0: .Interior.ColorIndex = 5: .Font.ColorIndex = 6
      Case 1: .Interior.ColorIndex = 3: .Font.ColorIndex = 5
      Case 2: .Interior.ColorIndex = 6: .Font.ColorIndex = 3
Xin hỏi GPE với code trên ta có màu chữ và màu nền theo số.
Nhưng nếu muốn biết màu nào tương ứng với số nào thì xem ở đâu ạ?
Em dùng Office207 sau đó ghi marco để xem mã màu thì số mã màu nó thể hiện khác với code trên quá,vd:
PHP:
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65280
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
 
Upvote 0
Xin mọi người chỉ dùm code xoá từng dòng có chứa dữ liệu trong sheet. Thanks

Private Sub CommandButton4_Click()
'xoá tung dong trong sheet vidu
Sheets("vidu").Activate
irow = Application.WorksheetFunction.CountA(Range("B:B")) + 1
Rows("irow:irow").clearcontens
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hic, mình vừa tập tẹ học VBA, có đoạn code này mình chưa hiểu, mong các bạn giải thích giúp mình

Đây là đoạn code đánh STT tự động, nguyên gốc nó thế này:

HTML:
Sub SoTT(Rng As Range)
With Rng
    .Resize(200, 1).Clear
    .Value = Evaluate("=row(R:R)")
    .NumberFormat = "00"
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
End With
End Sub

- Thứ nhất, Rng ở đây là vùng nào? từ ô nào tới ô nào? Sao mình không thấy khai báo?
- Thứ hai, đoạn:
HTML:
.Resize(200, 1).Clear
Có phải là từ vùng Rng mở rộng ra thêm 200 hàng và 01 cột? Hay thay đổi độ rộng của Rng thành 200 hàng và 01 cột?
- Thứ ba, đoạn dưới đây có nghĩa gì vậy các bạn?
HTML:
.Value = Evaluate("=row(R:R)")
Mình đã tra google cái vụ Evaluate cả ngày mà không hiểu lắm.

Rất mong các bạn giải thích giúp mình, xin chân thành cảm ơn các bạn.
 
Upvote 0
- Thứ nhất, Rng ở đây là vùng nào? từ ô nào tới ô nào? Sao mình không thấy khai báo?
Rng là bất kỳ vùng nào tùy ý bạn ---> Tức muốn dùng nó sẽ phải viết thêm 1 sub khác để khai báo rõ ràng Rng là cái giống gì
- Thứ hai, đoạn:
HTML:
.Resize(200, 1).Clear
Có phải là từ vùng Rng mở rộng ra thêm 200 hàng và 01 cột? Hay thay đổi độ rộng của Rng thành 200 hàng và 01 cột?
Từ cell đầu tiên của Rng, mở rộng ra 200 dòng, 1 cột --> Vậy bất kể Rng là bao nhiêu dòng, cột, sau khi Resize nó cũng sẽ có kích thước 200 dòng, 1 cột
- Thứ ba, đoạn dưới đây có nghĩa gì vậy các bạn?
HTML:
.Value = Evaluate("=row(R:R)")
Mình đã tra google cái vụ Evaluate cả ngày mà không hiểu lắm.

Rất mong các bạn giải thích giúp mình, xin chân thành cảm ơn các bạn.
.Value = Evaluate("=row(R:R)") nghĩa là Vùng Rng sẽ có giá trị = Evaluate("=row(R:R)")
Còn Evaluate("=row(R:R)") là gì? Rất đơn giản ta có thể thí nghiệm thế này:
- Quét chọn 1 vùng 1 cột, nhiều dòng (mấy dòng tùy ý)
- Gõ vào thanh Formula công thức =row(R:R) rồi bấm Ctrl + Shift + Enter
-------------------
Kết luận: Để chạy code này, ta phải viết thêm 1 Sub nữa, chẵng hạn:
PHP:
Sub test()
  SoTT Selection
End Sub
Quét chọn 1 vùng tùy ý (nhiều dòng, 1 cột) rồi chạy sub Test trên (tất nhiên trong Module vẫn phải có Sub SoTT)
 
Upvote 0
Cảm ơn bạn, nhưng còn chỗ này mình chưa hiểu:

Gồm 02 phần là Evaluate () và row(R:R) như vậy:
- Evaluate nghĩa là gì? Chức năng của nó ntn?
- Bản thân hàm Row() thì mình biết, nhưng đối só của nó R:R có nghĩa là sao bạn?

Rất mong bạn giải thích rõ hơn giúp mình, do mới học nên hỏi hơi ngớ ngẩn.
 
Upvote 0
Cảm ơn bạn, nhưng còn chỗ này mình chưa hiểu:


Gồm 02 phần là Evaluate () và row(R:R) như vậy:
- Evaluate nghĩa là gì? Chức năng của nó ntn?
- Bản thân hàm Row() thì mình biết, nhưng đối só của nó R:R có nghĩa là sao bạn?

Rất mong bạn giải thích rõ hơn giúp mình, do mới học nên hỏi hơi ngớ ngẩn.
Bạn thử đọc giải thích của anh Lê Văn Duyệt xem có giúp gì được bạn gì không
http://www.giaiphapexcel.com/forum/...g-thức-Evaluate-Understanding-Evaluate-Method
Thân
 
Upvote 0
Ndu ơi.
mình có đoạn code này (ngày trước dùng excel 2003) thì dùng được.
Nhưng bây giờ mình dùng excel 2007 thì nó báo lỗi
Sub FindMinValue()
Dim oRg As Range, iMin As Variant
Dim tmpStr1 As String
Dim tmpStr2 As String
Set oRg = Columns(10)
'Finding the minimum value
'change Application.Min(oRg) into Application.Max(oRg) to find the maximum value
iMin = Application.Min(oRg)
'Select cell containing the min value
oRg.Find(What:=iMin, _
After:=oRg.Range("A1"), _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=True, _
MatchByte:=True _
).Select

'Displaying min value info
With Selection
tmpStr1 = "A" & .Row & ":J" & .Row
End With

Range(tmpStr1).Select
Selection.Copy
Range("L3").Select
ActiveSheet.Paste
End Sub
nó báo dòng mình in đậm đấy và đó là lỗi (run - time error 91.......Object Varilable or with block Varilable not set.
Bạn làm ơn giúp mình nhé.
Thanhks​
 
Upvote 0
Theo mình thì

Câu lệnh này sẽ báo là lỗi, nếu nó không tìm ra ô cần tìm
Mã:
[B]oRg.Find(What:=iMin, [/B][B]After:=oRg.Range("A1"), LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, _
MatchByte:=True ).Select [/B]

Vô ngay đầu chương trình, bạn thử khai báo thêm 1 biến đối tượng như
PHP:
 Dim sRng As Range
Sau đó dùng lệnh
PHP:
Set sRng = oRg.Find(What:=iMin, After:=oRg.Range("A1"), LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, MatchByte:=True )

 If Not sRng Is Nothing Then sRng.Select
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi bạn, bài này mình đã từng đọc, nhưng do khả năng hạn hẹp nên mình không hiểu lắm. Bạn có thể nói nôm na cho mình ý nghĩa của Evaluate là gì không?

Còn vụ đối số R:R nữa.

Hic hic.
 
Upvote 0
Xin lỗi bạn, bài này mình đã từng đọc, nhưng do khả năng hạn hẹp nên mình không hiểu lắm. Bạn có thể nói nôm na cho mình ý nghĩa của Evaluate là gì không?

Còn vụ đối số R:R nữa.

Hic hic.
Có thể hiểu nôm na Evaluate là 1 hàm dùng để chuyển 1 chuổi biểu thức sang giá trị
Ví dụ: Evaluate("1+2+3") sẽ cho kết quả = 6 hoặc Evaluate("SUM(A1:A10)") sẽ cho kết quả là tổng vùng A1:A10
Còn thằng R:R thì là vùng R:R thôi ---> Bạn có thể thay nó thành cái gì tùy ý, chẳng hạn là Evaluate("ROW(A:A)") cũng được vậy (tôi thì thích viết chữ R cho nó có vẻ là.. ROW, thế thôi)
 
Upvote 0
Hic, chắc tại mình dốt nên tới giờ vẫn chưa hiểu lắm.

Cụ thể như sau: Nếu Evaluate được hiểu theo cách hiểu trên thì tại sao người ta lại sử dụng nó? Như trong vD dưới đây:

Sao không dùng Range("A1").value= 1+2+3, mà lại dùng Range("A1").value = Evaluate("1+2+4")?
Tương tự, sao không dùng Range("A1").value= SUM(A1:A10) mà lại dùng Range("A1").value=evaluate("Sum(A1:A10)")?

Vậy phải chăng mục đích sử dụng của nó là để dùng các hàm mà VBA không sử dụng được? VD: countif hay sumif gì đó?

Còn vụ R:R là ký tự đại diện thôi hả bạn, hay là chữ R đó là lấy cột R? Nếu thay bằng A:A thì sẽ lấy cột A? thay bằng A:B sẽ lấy cột A và B hả bạn.

Mình không hiểu thiệt nên hỏi quài, rất xin lỗi các bạn nha.
 
Lần chỉnh sửa cuối:
Upvote 0
Câu lệnh này sẽ báo là lỗi, nếu nó không tìm ra ô cần tìm
Mã:
[B]oRg.Find(What:=iMin, [/B][B]After:=oRg.Range("A1"), LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, _
MatchByte:=True ).Select [/B]

Vô ngay đầu chương trình, bạn thử khai báo thêm 1 biến đối tượng như
PHP:
 Dim sRng As Range
Sau đó dùng lệnh
PHP:
Set sRng = oRg.Find(What:=iMin, After:=oRg.Range("A1"), LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, MatchByte:=True )

 If Not sRng Is Nothing Then sRng.Select


Mình đã sửa như Chanh nói nhưng nó vẫn chạy không đúng.
mỗi lần chạy ra các kết quả khác nhau
 
Upvote 0
Hic, chắc tại mình dốt nên tới giờ vẫn chưa hiểu lắm. Cụ thể như sau: Nếu Evaluate được hiểu theo cách hiểu trên thì tại sao người ta lại sử dụng nó? Như trong vD dưới đây: Sao không dùng Range("A1").value= 1+2+3, mà lại dùng Range("A1").value = Evaluate("1+2+4")? Tương tự, sao không dùng Range("A1").value= SUM(A1:A10) mà lại dùng Range("A1").value=evaluate("Sum(A1:A10)")? Vậy phải chăng mục đích sử dụng của nó là để dùng các hàm mà VBA không sử dụng được? VD: countif hay sumif gì đó? Còn vụ R:R là ký tự đại diện thôi hả bạn, hay là chữ R đó là lấy cột R? Nếu thay bằng A:A thì sẽ lấy cột A? thay bằng A:B sẽ lấy cột A và B hả bạn. Mình không hiểu thiệt nên hỏi quài, rất xin lỗi các bạn nha. Ps: diễn đàn bị sao mà enter xuống rồi, mà khi post vẫn nhảy lên thành 01 đoạn vậy nè trời.
Ví dụ chỉ là ví dụ thôi. Còn ứng dụng như thế nào là tùy vào khả năng của mỗi người. Trong file là một ví dụ đơn giản phải dùng Evaluate.
To tuangiang25022008:
Bạn chỉ cần dùng một câu lệnh này thôi:
PHP:
Range("A" & WorksheetFunction.Match(WorksheetFunction.Min([J:J]), [J:J], 0)).Resize(, 10).Copy [L3]
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình đã sửa như Chanh nói nhưng nó vẫn chạy không đúng.
mỗi lần chạy ra các kết quả khác nhau

Vậy bạn hãy cho biết thêm vài thông tin như sau:

(1) Vùng để fương thức tim là vùng như thế nào? Nhiều hàng của 1 cột, hay nhiều cột của 1 hàng hoặc cả hai?

(2) Trong vùng đó trước khi tìm ta có làm gì để nó biến đổi số liệu không? Ở đây bạn dùng tham số xlPart nên mình mới hỏi vậy

(3) Cũng là chuyện đề fòng nên cũng fải hỏi: Vùng để tìm kiếm có những ô trộn lại không?

(3.1) Số liệu mà bạn tìm có dạng ngày tháng fải không? hay chỉ là số trị hoặc chuỗi?

Chờ tin từ bạn!
 
Upvote 0
Hic, chắc tại mình dốt nên tới giờ vẫn chưa hiểu lắm.

Cụ thể như sau: Nếu Evaluate được hiểu theo cách hiểu trên thì tại sao người ta lại sử dụng nó? Như trong vD dưới đây:

Sao không dùng Range("A1").value= 1+2+3, mà lại dùng Range("A1").value = Evaluate("1+2+4")?
Tương tự, sao không dùng Range("A1").value= SUM(A1:A10) mà lại dùng Range("A1").value=evaluate("Sum(A1:A10)")?

Vậy phải chăng mục đích sử dụng của nó là để dùng các hàm mà VBA không sử dụng được? VD: countif hay sumif gì đó?

Còn vụ R:R là ký tự đại diện thôi hả bạn, hay là chữ R đó là lấy cột R? Nếu thay bằng A:A thì sẽ lấy cột A? thay bằng A:B sẽ lấy cột A và B hả bạn.

Mình không hiểu thiệt nên hỏi quài, rất xin lỗi các bạn nha.
Chỉ là 1 ví dụ nhỏ cho bạn hình dung về Evaluate mà thôi. Đương nhiên, tùy tình huống mà quyết định dùng cái gì
Lấy ví dụ với công thức là dạng công thức mảng thì làm sao bạn gán theo cách thông thường? Chẳng hạn như trường hợp gán STT ở ví dụ trên (=ROW(R:R) chính là công thức mảng)
Hoặc giả sử có trường hợp ứng dụng trong việc diễn giải công thức: Cột A người ta ghi diễn giải (ví dụ như (3*5+10)/8 +9) còn cột B người ta muốn tính kết quả của chuổi biểu thức đã ghi tại cột A ---> Trường hợp này có phải dùng Evaluate là hợp lý không?
 
Upvote 0
Rất chân thành cảm ơn 02 bạn: Huuthang_bd và bạn ndu9681631 nhờ 02 bạn mà người mới bắt đầu học VBA như mình mới hiểu được một số vấn đề liên quan đến evaluate.

Nhân đây mình hỏi luôn, sao code này của mình lại trả về một cái giá trị là Empty và một cái giá trị là 0 vậy ta? Vậy cuối cùng lúc chưa gán, giá trị của nó là gì?

HTML:
Dim BeginR, EndR As Integer
Sub Giai()
   MsgBox BeginR
   MsgBox EndR
End Sub

Thêm nữa là sự khác nhau giữa các giá trị sau trong VBA như thế nào?
- Empty (cái này chắc giống "")
- Null
- Is nothing
Và nếu mình muốn một ô có giá trị là không là gì cả (đại loại giống một ô chưa nhập dữ liệu gì hết kể cả khoản trắng) thì sẽ gán cho nó giá trị nào trong 03 giá trị trên?
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy bạn hãy cho biết thêm vài thông tin như sau:

(1) Vùng để fương thức tim là vùng như thế nào? Nhiều hàng của 1 cột, hay nhiều cột của 1 hàng hoặc cả hai?

(2) Trong vùng đó trước khi tìm ta có làm gì để nó biến đổi số liệu không? Ở đây bạn dùng tham số xlPart nên mình mới hỏi vậy

(3) Cũng là chuyện đề fòng nên cũng fải hỏi: Vùng để tìm kiếm có những ô trộn lại không?

(3.1) Số liệu mà bạn tìm có dạng ngày tháng fải không? hay chỉ là số trị hoặc chuỗi?

Chờ tin từ bạn!

1. Vùng tìm kiếm ở đây là tìm giá trị nhỏ nhất của cột thứ 10. (dòng đầu tiên của cột 10 là chữ, những dòng còn lại của cột 10 là số)
Khi tìm được giá trị nhỏ nhất thì tìm tham chiếu các cột khác (giả sử cột 10 có giá trị nhỏ nhất ở dòng 100, thi sẽ lấy các giá trị (hay chữ ở dòng 100 của các cột A,B,C, ....,J)tức là tham chiếu dòng 100 của cột A đến cột J và copy sang cột S.
2. Các số liệu của mình không phải là ngày tháng.
Mong tin bạn
 
Upvote 0
Những gì bạn mô tả có thể giống như macro này:

PHP:
Option Explicit
Sub TimMinInColumn()
 Dim Rng As Range, sRng As Range
 Dim Min_ As Double
 
 Set Rng = Columns("J:J")
 Min_ = Application.WorksheetFunction.Min(Rng)
 Set sRng = Rng.Find(Min_, , xlFormulas, xlWhole)     '<=|'
 If Not sRng Is Nothing Then
   MsgBox sRng.Address, , "GPE Xin Chào Ban!"
   Cells(sRng.Row, "A").Resize(, 10).Copy Destination:=Cells(sRng.Row, "S")
 End If
End Sub

Bạn thử xem sao!
 
Upvote 0
PHP:
Option Explicit
Sub TimMinInColumn()
 Dim Rng As Range, sRng As Range
 Dim Min_ As Double
 
 Set Rng = Columns("J:J")
 Min_ = Application.WorksheetFunction.Min(Rng)
 Set sRng = Rng.Find(Min_, , xlFormulas, xlWhole)     '<=|'
 If Not sRng Is Nothing Then
   MsgBox sRng.Address, , "GPE Xin Chào Ban!"
   Cells(sRng.Row, "A").Resize(, 10).Copy Destination:=Cells(sRng.Row, "S")
 End If
End Sub

Bạn thử xem sao!

giá trị cần tìm thì đúng nhưng nó không copy giá trị mình cần tìm sang cột S3 (tìm được giá trị min tại dòng 100 thì sẽ copy cột A100, B100, ...J100 vào cột S3,T3,.....,AB3
Bạn ơi cho mình hỏi.
bây giờ mình có 50 sheet
trong đó có 4 sheet Có tên là AS, DB, GH, JL là mình không muốn tìm giá trị min (nhỏ nhất)
còn lại các sheet khác thì tìm theo như trên thì mình làm như thế nào.
mong câu trả lời của bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử với cái ni xem sao!

PHP:
Option Explicit
Sub TimMinInColumn10OffWorkSheets()
 Dim Rng As Range, sRng As Range, Sh As Worksheet
 Dim Min_ As Double
 Const ShName As String = "AS@DB@GH@JL@"
 
 For Each Sh In ThisWorkbook.Worksheets
   If InStr(ShName, Sh.Name) Then
   Else
      Set Rng = Columns("J:J")
      Min_ = Application.WorksheetFunction.Min(Rng)
      Set sRng = Rng.Find(Min_, , xlFormulas, xlWhole)     '<=|'
      If Not sRng Is Nothing Then
         MsgBox Sh.Name, , "GPE Xin Chào Ban!"
         Cells(sRng.Row, "A").Resize(, 10).Copy Destination:=Cells(sRng.Row, "S")
      End If
   End If
 Next Sh
End Sub
 
Upvote 0
PHP:
Option Explicit
Sub TimMinInColumn10OffWorkSheets()
 Dim Rng As Range, sRng As Range, Sh As Worksheet
 Dim Min_ As Double
 Const ShName As String = "AS@DB@GH@JL@"
 
 For Each Sh In ThisWorkbook.Worksheets
   If InStr(ShName, Sh.Name) Then
   Else
      Set Rng = Columns("J:J")
      Min_ = Application.WorksheetFunction.Min(Rng)
      Set sRng = Rng.Find(Min_, , xlFormulas, xlWhole)     '<=|'
      If Not sRng Is Nothing Then
         MsgBox Sh.Name, , "GPE Xin Chào Ban!"
         Cells(sRng.Row, "A").Resize(, 10).Copy Destination:=Cells(sRng.Row, "S")
      End If
   End If
 Next Sh
End Sub
Bạn ơi.
giá trị cần tìm thì đúng nhưng nó không copy giá trị mình cần tìm sang cột S3 (tìm được giá trị min tại dòng 100 thì sẽ copy cột A100, B100, ...J100 vào cột S3,T3,.....,AB3
 
Upvote 0
Hiện nó copy 10 ô liền kề kể từ ô đầu tiên trong hàng tìm thấy chép đến 10 bắt đầu từ cột 'S' cùng hàng;

Bạn thử tự đưa về chổ nào đó theo í bạn xem sao!

Còn đây là Copy đến hàng thứ 3 cũng bắt đầu từ cột 'S'

Mã:
[COLOR=#000000][COLOR=#DD0000] [/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]sRng[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Row[/COLOR][COLOR=#007700], [/COLOR][COLOR=#DD0000]"A"[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Resize[/COLOR][COLOR=#007700](, [/COLOR][COLOR=#0000BB]10[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Copy Destination[/COLOR][COLOR=#007700]:=[/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][B][COLOR=#0000BB]3[/COLOR][/B][COLOR=#0000BB][/COLOR][COLOR=#007700], [/COLOR][COLOR=#DD0000]"S"[/COLOR][COLOR=#007700])
[/COLOR][/COLOR]
 
Upvote 0
nhờ các bạn check dùm tại sao không hiện lên giá trị max

Nhờ Ndu mà mình đã add được các file excel vào trong các sheet của một file.
Nhưng không hiểu sao khi mình tìm giá trị max thì lại không làm được (chính xác là không lên kết quả).
Mong các bạn check hộ.
Mong sớm hồi âm
 

File đính kèm

Upvote 0
1 file là đủ rồi!

Bạn đưa lên quá nhiều file làm chi vậy, chỉ tổ loãng vấn đề & dễ gây fiền chán!
 
Upvote 0
Không phải đâu bạn àh.
file tổng verson 1 là tổng kết của 3 file kia. (viết bằng vba)
bạn vào file này thì sẽ biết bạ àh.
mong sớm hồi âm của bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm MAX() chỉ xài với các ô chứa số liệu, chứ bạn bắt nó xài với dữ liệu nó đếch chịu làm là fải rồi còn gì!
Cái này do qui ước trong Control Panel giữa 2 máy thôi, máy làm ra file có qui ước khác, bạn đem file về máy bạn với qui ước khác
 
Upvote 0
Hàm MAX() chỉ xài với các ô chứa số liệu, chứ bạn bắt nó xài với dữ liệu nó đếch chịu làm là fải rồi còn gì!
Cái này do qui ước trong Control Panel giữa 2 máy thôi, máy làm ra file có qui ước khác, bạn đem file về máy bạn với qui ước khác
thế thì bây giờ mình làm như thế nào.
bạn chỉ giúp mình được không.
 
Upvote 0
Với file của bạn, mình thử chạy macro này & OK:
PHP:
Sub IsNumber()
 Dim Cls As Range, Rng As Range, Rws As Long
 
 Rws = [b4].CurrentRegion.Rows.Count
 Set Rng = [c6].Resize(Rws, 6)
 For Each Cls In Rng
   If IsNumeric(Cls.Value) And Cls.Value <> "" Then
      Cls.Value = CDbl(Cls.Value)
   End If
 Next Cls
End Sub
 
Upvote 0
Với file của bạn, mình thử chạy macro này & OK:
PHP:
Sub IsNumber()
 Dim Cls As Range, Rng As Range, Rws As Long
 
 Rws = [b4].CurrentRegion.Rows.Count
 Set Rng = [c6].Resize(Rws, 6)
 For Each Cls In Rng
   If IsNumeric(Cls.Value) And Cls.Value <> "" Then
      Cls.Value = CDbl(Cls.Value)
   End If
 Next Cls
End Sub

Mình làm được roi HYen17 rồi.
Nhưng khi tớ thay đổi tên sheet thì nó báo lỗi trên.
Mong bạn giúp mình.
Mong hồi âm sớm.
thanks
 

File đính kèm

Upvote 0
Nhưng khi tớ thay đổi tên sheet thì nó báo lỗi trên.
Mong bạn giúp mình.
Mong hồi âm sớm.

May quá lỗi trong macro của ai đó chớ không fải mình là tác giả!
/-(ơn nữa ba cái Conetion gì gì ấy mình dị ứng lắm;
/-)ừng trong mong gì từ mình bạn à!


Thân!
 
Upvote 0
May quá lỗi trong macro của ai đó chớ không fải mình là tác giả!
/-(ơn nữa ba cái Conetion gì gì ấy mình dị ứng lắm;
/-)ừng trong mong gì từ mình bạn à!


Thân!
dù sao cũng cám ơn bạn nhiều.
Bạn đã giúp mình rất nhiều đấy.
thanks.
thật ra thì mình chỉ cầu toàn hơn thôi.
còn để như củ thì mình vẫn dùng được mà,
một lần nữa cám ơn bạn rất nhiều.
chúc bạn luôn may mắn và thành đạt
thân.
 
Upvote 0
Lọc dữ liệu

Xin nhờ các Thầy, các Anh, Chị....giúp đỡTôi có 1 file gồm các cột: Tên người, tuổi, năm sinh, trình độ.... Nay muốn dùng code để lọc danh sách theo tuổi, năm sinh, trình độ.... Nhờ chỉ dùm, Xin đa tạ
 
Upvote 0
Xin nhờ các Thầy, các Anh, Chị....giúp đỡTôi có 1 file gồm các cột: Tên người, tuổi, năm sinh, trình độ.... Nay muốn dùng code để lọc danh sách theo tuổi, năm sinh, trình độ.... Nhờ chỉ dùm, Xin đa tạ
Đưa file lên đi ạ. Mà dùng code lọc chắc recode thao tác Advanced cũng ngon lành.
 
Upvote 0
Xin nhờ các Thầy, các Anh, Chị....giúp đỡTôi có 1 file gồm các cột: Tên người, tuổi, năm sinh, trình độ.... Nay muốn dùng code để lọc danh sách theo tuổi, năm sinh, trình độ.... Nhờ chỉ dùm, Xin đa tạ

Cái này dùng AutoFilter thôi, đâu cần dùng code? Xem File.

Còn muốn dùng Code, xem tại bài này: http://www.giaiphapexcel.com/forum/...-về-hàm-UDF-Filter2DArray&p=360839#post360839
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ viết code lọc dữ liệu

Tôi làm công tác văn thư ở trường học, do trình độ tin học còn quá yếu, nay nhờ các Thầy, Cô, các bạn giúp viết dùm đoạn code với mục đích như sau: Trong thời khóa biểu của trường, nếu gõ tên giáo viên nào thì lọc thời khóa biểu của người đó ra. Tôi có gởi file kèm. Cụ thể tại ô K1 nếu gõ tên "Toản" thì trích xuất thời khóa biểu cá nhân ra tại ô L3:Q66 như trong file. Rất mong các Thầy, Cô, các bạn giúp đỡ. Xin cám ơn nhiều. Xin giải quyết nội dung trên bằng code vba
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Không fải gỏ, mà là chọn từ danh sách giáo viên của trường

Tôi làm văn thư ở trường học, nay nhờ các Thầy, Cô, các bạn giúp viết dùm đoạn code với mục đích như sau: Trong thời khóa biểu của trường, nếu gõ tên giáo viên nào thì lọc thời khóa biểu của người đó ra. Tôi có gởi file kèm. Cụ thể tại ô K1 nếu gõ tên "Toản" thì trích xuất thời khóa biểu cá nhân ra tại ô L3:Q66 như trong file. Rất mong các Thầy, Cô, các bạn giúp đỡ.

. . . . . . . . . .> xem trong file . . . . . >
 

File đính kèm

Upvote 0
Cám ơn bạn, nhưng tôi muốn giải quyết nội dung trên bằng code, bạn giúp tôi nha
 
Upvote 0
Macro sự kiện mà!

Cám ơn bạn, nhưng tôi muốn giải quyết nội dung trên bằng code, bạn giúp tôi nha

Bạn tìm đâu đó bên dưới trang tính sẽ thấy các macro như sau:

Mã:
Option Explicit
[B]Private Sub Worksheet_Change(ByVal Target As Range)[/B]
 If Not Intersect(Target, [K1]) Is Nothing Then
   Union(Range("N5:Q34"), Range("N37:Q70")).ClearContents
   TKBCaNhan Target
 End If
[B]End Sub[/B]

PHP:
Sub TKBCaNhan(Targ As Range)
 Dim Rng As Range, sRng As Range
 Const MN As String = " ("
 Dim VTr As Byte, Hang As Long, Rs As Long
 Dim MyAdd As String, Mon As String, Lop As String
 
 Set Rng = Union(Range("C5:J29"), Range("C36:J61"))
 Set sRng = Rng.Find(Targ.Value, , xlFormulas, xlPart)
 If Not sRng Is Nothing Then
   MyAdd = sRng.Address
   Do
      Rs = sRng.Row:                      Hang = IIf(Rs < 33, 2, 34)
      VTr = InStr(sRng.Value, MN):        Lop = Cells(Hang, sRng.Column).Value
      Cells(Rs + 2, "o").Value = Lop:     Mon = Left(sRng, VTr - 1)
      Cells(Rs + 2, "N").Value = Lop & Mon
      Cells(Rs + 2, "Q").Value = Mon
      Set sRng = Rng.FindNext(sRng)
   Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
 End If
End Sub

Ngoài ra mình còn khuyến mãi cho bạn 1 macro tạo danh sách giáo viên trong trường nữa kìa!

Lần sau nhớ tìm trước khi fát biểu dùm cái nha!
 
Upvote 0
Xin lỗ bạn SA_DQ. Mình xem không kỹ. Cám ơn bạn nhiều. Chúc bạn khỏe
Bạn giúp mình thêm chút nữa nha. Cụ thể
1. Khi trích lọc thời khóa biểu cá nhân ở cột môn lớp (cột N) chỉ lấy 2 ký tự môn (6DAVăn thì lấy 6DAV thôi) cột môn (Q) cũng vậy
2. Khi ở Thời khóa biểu của trường, giữa môn học và tên người dạy không có khoảng trắng vd: AVăn(Cương) thí code chạy sai.
làm sao để dù có hay không có khoảng trắng vẫn chạy được
Bạn giúp minh nha.Cám ơn nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Mình hướng dẫn từ xa, bạn sửa lại xem thử nha:

(2) Bạn tìm tới dòng lệnh tương tự như
PHP:
Const MN As String = "("
& sửa lại như vậy

(1) Bạn tìm tới dòng tương tự như
PHP:
Mon = Left(sRng, 2)  'VTr - 1'
& sửa

( Ở đây thay vì VTr -1 bạn thay thàng con số 2

Chúc thắng lợi!
 
Upvote 0
Chào bạn HYen 17. Cám ơn bạn, mình đã làm theo bạn hướng dẫn nhưng kết quả không đúng theo yêu cầu đặt ra: (2. Khi ở Thời khóa biểu của trường, giữa môn học và tên người dạy không có khoảng trắng vd: AVăn(Cương) thí code chạy sai. làm sao để dù có khoảng trắng, người khác không co khoảng trắng vẫn chạy đúng). còn vấn đề 1 (1. Khi trích lọc thời khóa biểu cá nhân ở cột môn lớp (cột N) chỉ lấy 2 ký tự môn (6DAVăn thì lấy 6DAV thôi) cột môn (Q) cũng vậy) với môn NVăn thì đúng na NV nhưng với môn Tin thi sai kết quả lá T chứ không phải la Ti như yêu cầu. Rất mong bạn chỉ dẫn thêm. Cám ơn bạn nhiều.
 
Upvote 0
các bạn cho mình hỏi, mình đang có 1 file excel gồm nhìu cell đang có 2 hàng (ví dụ dòng 1 ALT + Enter dòng 2), giờ mình muốn format cho nó theo dạng dòng 1 Bold và dòng 2 Italic, mình muốn làm vậy cho nhìu cell thì phải như thế nào, mong các bạn giúp mình, thanks all
 
Upvote 0
các bạn cho mình hỏi, mình đang có 1 file excel gồm nhìu cell đang có 2 hàng (ví dụ dòng 1 ALT + Enter dòng 2), giờ mình muốn format cho nó theo dạng dòng 1 Bold và dòng 2 Italic, mình muốn làm vậy cho nhìu cell thì phải như thế nào, mong các bạn giúp mình, thanks all

Có ngay cho bạn đây:

Bạn chọn ô hoặc khối ô mà bạn muốn dòng trên tô đậm, dòng dưới nghiêng, sau đó bạn cho chạy thủ tục sau đây:

PHP:
Sub Bold_Italic()
    Dim Rng As Range, i As Long
    For Each Rng In Selection
        With Rng
            .Font.Bold = False
            .Font.Italic = False
            i = InStr(.Value, Chr(10))
            .Characters(Start:=1, Length:=i).Font.FontStyle = "Bold"
            .Characters(Start:=i, Length:=Len(.Value) + 1 - i).Font.FontStyle = "Italic"
        End With
    Next
End Sub

Vừa ý chưa nè!
 
Lần chỉnh sửa cuối:
Upvote 0
(òn đây là xử lý trên các ô có dữ liệu thuộc cột 'B'

PHP:
Option Explicit
Sub gpeALT_ENTER()
 Dim StrC As String, Cls As Range, VTr As Long
 
 StrC = Chr(10)
 For Each Cls In Range([B1], [B65500].End(xlUp))
    VTr = InStr(Cls.Value, StrC)
    If VTr > 0 Then
        Cls.Select
        With ActiveCell.Characters(Start:=1, Length:=VTr - 1).Font
            .FontStyle = "Bold"
            .ColorIndex = 3
        End With
        With ActiveCell.Characters(Start:=VTr + 1, Length:=Len(Cls.Value)).Font
            .FontStyle = "Italic"
            .ColorIndex = 5
        End With
    End If
 Next Cls
End Sub
 
Upvote 0
Các bạn cho hỏi có thể chuyển các hàm sau thành code được không? Nếu được xin nhờ các bạn giúp dùm với. Hàm này chạy trong khoảng từ E4:E32 và E35:E64. Cụ thể: =IF(C4="","",COUNTIF($C$4:C4,C4)+VLOOKUP($C$1,Tiet_Tuan,MATCH(C4,Lop,0)+3,0)-1)
Xin cám ơn các bạn
 
Upvote 0
Chào diễn đàn, mình nhờ các cao thủ trên diễn đàn viết giúp đoạn code xóa dữ liệu, khi nhấp vào nút xóa thì hiện hộp thoại thông báo " bạn có muốn xóa dữ liệu không" và có hai nút YES NO nếu chọn yes thì sẽ xóa các ô đã chọn và chọn No thì không . chân thành cảm ơn diễn đàn
 
Upvote 0
Chào diễn đàn, mình nhờ các cao thủ trên diễn đàn viết giúp đoạn code xóa dữ liệu, khi nhấp vào nút xóa thì hiện hộp thoại thông báo " bạn có muốn xóa dữ liệu không" và có hai nút YES NO nếu chọn yes thì sẽ xóa các ô đã chọn và chọn No thì không . chân thành cảm ơn diễn đàn

Bạn tạo Module chứa Macro Xoa
Mã:
Sub Xoa()
    Msg = MsgBox("Xoa du lieu trong vung " & Selection.Address, vbYesNo)
    If Msg = 7 Then Exit Sub
    Selection.ClearContents
End Sub

Để gọi Macro Xoa bằng cách phải chuột thì bạn chép vào Module Sheet đoạn code sau
Mã:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Cancel = 1
Xoa
End Sub

Bạn quét chọn vùng muốn xóa và phải chuột để thử nha.
 
Upvote 0
Bạn tạo Module chứa Macro Xoa
Mã:
Sub Xoa()
    Msg = MsgBox("Xoa du lieu trong vung " & Selection.Address, vbYesNo)
    If Msg = 7 Then Exit Sub
    Selection.ClearContents
End Sub

Để gọi Macro Xoa bằng cách phải chuột thì bạn chép vào Module Sheet đoạn code sau
Mã:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Cancel = 1
Xoa
End Sub

Bạn quét chọn vùng muốn xóa và phải chuột để thử nha.
Em thấy làm vầy có lý hơn:
PHP:
Sub Auto_Open()
  Application.OnKey "{DEL}", "Xoa"
End Sub
PHP:
Sub Auto_Close()
  Application.OnKey "{DEL}"
End Sub
PHP:
Sub Xoa()
  Dim Msg As Long
  Msg = MsgBox("Xoa du lieu trong vung " & Selection.Address, vbYesNo)
  If Msg = 6 Then Selection.ClearContents
End Sub
Chọn vùng rồi cứ bâm nút Delete trên bàn phím là Sub Xoa tự nhiên hoạt động để hiển thị MsgBox
 
Upvote 0
Cảm ơn Ndu ! Cái vụ Auto_Open và Auto_Close để OnKey phím Delete bây giờ mới biết, từ trước tới giờ mình toàn phải sử dụng sự kiện Worksheet_BeforeDoubleClick hoặc Worksheet_BeforeRightClick để gọi Macro.
 
Upvote 0
PHP:
Sub del()
With Sheet2
.Protection.AllowEditRanges(1).Delete
.Protection.AllowEditRanges(1).Delete
.Protection.AllowEditRanges(1).Delete
.Protection.AllowEditRanges(1).Delete
End With
End Su
Xin hỏi code trên số (1) có ý nghĩ gì vậy?
Và tại sao em muốn xoá 4 vùng với code trên thì lại không được ạ, vậy pahir làm sao để xoá toàn bộ pass vùng trong 1 sheet.
http://www.giaiphapexcel.com/forum/showthread.php?58511-Code-xoá-pass-vùng!
thân!
 
Upvote 0
Nhờ viết code lọc dữ liệu

Cám ơn bạn ChanhTQ@ nhiều, nhưng bạn ơi đoạn code bạn làm giúp mình chạy vẫn sai. khi gọi tên giáo viên Hảo vẫn lấy lộn tiết dạy của T.Thảo hoặc của D.Thảo. Bạn giúp mình chữa lại nha. mình mới làm quen với Vba nên yếu lắm. Cám ơn bạn nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub del()
With Sheet2
 .Protection.AllowEditRanges(1).Delete
End With
End Su
Xin hỏi code trên số (1) có ý nghĩ gì vậy?
Và tại sao em muốn xoá 4 vùng với code trên thì lại không được ạ, vậy pahir làm sao để xoá toàn bộ pass vùng trong 1 sheet.
thân!

Code trên số (1) có nghĩa là vùng 1 (vùng thứ nhất bị Protection)
Muốn xóa 4 vùng thì bạn phải viết như sau:
With Sheet2
.Protection.AllowEditRanges(1).Delete
.Protection.AllowEditRanges(2).Delete
.Protection.AllowEditRanges(3).Delete
.Protection.AllowEditRanges(4).Delete
End With

Muốn xóa tất cả các vùng trong Sheet2 thì bạn thử code sau:
Mã:
Sub Delete_Allow()
    On Error Resume Next
    With Sheets("Sheet2")
        For Each Alow In .Protection.AllowEditRanges
            Alow.Delete
        Next
     End With
End Sub
 
Upvote 0
Code trên số (1) có nghĩa là vùng 1 (vùng thứ nhất bị Protection)
Muốn xóa 4 vùng thì bạn phải viết như sau:
With Sheet2
.Protection.AllowEditRanges(1).Delete
.Protection.AllowEditRanges(2).Delete
.Protection.AllowEditRanges(3).Delete
.Protection.AllowEditRanges(4).Delete
End With

Muốn xóa tất cả các vùng trong Sheet2 thì bạn thử code sau:
Mã:
Sub Delete_Allow()
    On Error Resume Next
    With Sheets("Sheet2")
        For Each Alow In .Protection.AllowEditRanges
            Alow.Delete
        Next
     End With
End Sub
Vậy muốn xoá tất cả vùng trong 1 woordbook thì fair sửa lại code thế nào vậy anh?
 
Upvote 0
Vậy muốn xoá tất cả vùng trong 1 woordbook thì fair sửa lại code thế nào vậy anh?
Bạn sửa lại như thế này thử xem.
PHP:
Sub Delete_Allow()
On Error Resume Next
For Each sh In Sheets
    For Each Alow In sh.Protection.AllowEditRanges
        Alow.Delete
    Next
Next
End Sub
 
Upvote 0
làm thế nào để gán giá trị có điều kiện bởi vì dòng và cột thay đổi

Mình không hiểu tại dùng hàm gì trong VBA để làm tròn số số thập phân đến phần nghìn.
Mình có bảng tính khoảng 100000 dòng thì bây giờ ở cột 6 từ dòng thứ 5 trở đi toàn các chữ số đến thập phân.
ví dụ:
0.6677888
0.90000012
0.29987764
.........
.........
bây giờ mình muốn làm tròn số đến chữ số hàng nghìn thì mình làm thế nào
0.6677888 thành 0.67


0.90000012 thành 0.90

0.29987764 thành 0.30


mong các bạn giúp.

mình đã chuyển bài này sang mục khác
http://www.giaiphapexcel.com/forum/...án-đối-tượng-có-điều-kiện&p=365427#post365427
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Private Sub InTungPhanTu(ByVal PhanTu As String, SoBanIn As Long)Dim ViTri As Long, i As LongViTri = InStr(PhanTu, "-")    If ViTri > 0 Then        For i = CLng(Left(PhanTu, ViTri - 1)) To CLng(Right(PhanTu, Len(PhanTu) - ViTri))            Sheet2.[C6].Value = Sheet1.Cells(i + 5, "A").Value            MsgBox Sheet2.[C5].Value            'ActiveSheet.PrintOut Copies:=SoBanIn, ActivePrinter:=LBMayin.Caption        Next    Else        Sheet2.[C6].Value = Sheet1.Cells(PhanTu + 5, "A").Value        MsgBox Sheet2.[C5].Value        'ActiveSheet.PrintOut Copies:=SoBanIn, ActivePrinter:=LBMayin.Caption    End IfEnd Sub

Em xin hỏi hàm CLng có nghĩa là gì? em search hoài không thấy

 
Upvote 0
Em xin hỏi hàm CLng có nghĩa là gì? em search hoài không thấy

Trong cửa sổ VBA, bạn chi cần bôi đen chữ CLng rồi bấm F1 đã có ngay câu trả lời rồi
CLng dùng để biến đổi 1 giá trị về kiểu biến Long (Do số tách ra từ chuổi, nó chỉ là Text nên phải qua phép biến đổi này để thành số thật sự)
Nếu bạn không muốn dùng CLng thì có thể nhân với 1 cũng chẳng có vấn đề gì (thay CLng(Left(PhanTu, ViTri - 1)) thành 1*(Left(PhanTu, ViTri - 1)) )
 
Upvote 0
Trong cửa sổ VBA, bạn chi cần bôi đen chữ CLng rồi bấm F1 đã có ngay câu trả lời rồi
CLng dùng để biến đổi 1 giá trị về kiểu biến Long (Do số tách ra từ chuổi, nó chỉ là Text nên phải qua phép biến đổi này để thành số thật sự)
Nếu bạn không muốn dùng CLng thì có thể nhân với 1 cũng chẳng có vấn đề gì (thay CLng(Left(PhanTu, ViTri - 1)) thành 1*(Left(PhanTu, ViTri - 1)) )

Em hiểu rồi, nó kiểu Số dạng TẼXT *1...ẹc nhưng viết 1* sẽ thấy dễ hiểu hơn
Em đã nhấn F1 nhưng nó ra phần Bing search trực tiếp trên internet nhưng ko thấy có ra Chắc em chưa tic hay set đâu đó trong ẽxel rồi.
 
Upvote 0
PHP:
Sub Unlock()
    For X = 9 To 20
    Sheets(X).[H5:H6,F12:F227,I12:AM227].Locked = False
    Next
End Sub
Xin hỏi GPE code này của em sửa lại thế nào cho đỡ bị lỗi vây?
Thanks!
 
Upvote 0
à! không fair do tên thầy ạ! nó báo lỗi ở nội dung code.Còn cái tên em sửa lại tên khác mà miễn sao không trùng với các tên hệ thống của Exel.
Thì bạn cũng phải đưa file lên đây chứ
Còn tạm thời bạn thử đừng dùng Range theo kiểu [...] ---> Sửa thành Sheets(X).Range("H5:H6,F12:F227,I12:AM227").Locked = False xem thế nào nhé
 
Upvote 0
Hỏi cách chèn 1 hình ảnh vào 1 ô trong file Excel

Mình là dân mới học lập trình VBA, nhiều thứ cũng tự mò. Mình muốn dùng code để chèn tự động 1 hình ảnh vào 1 ô Excel.
PHP:
Public Function InsertPicture() As Object
InsertPicture = Sheet1.Pictures.Insert("Penguins.jpg")
With Pic
.Top = Sheet1.Cells(48, 4).Top
.Left = Sheet1.Cells(48, 4).Left
End With
End Function
Ở trên ô Excel, mình gõ InsertPicture() thì nó bị #VALUE!
Vậy đoạn code của mình bị sai chỗ nào? Mong các bạn giúp đỡ.
File đính kèm: http://www.mediafire.com/?w2m7nqu3kjf5u6k
 
Upvote 0
Tham khảo code của các mem post về xử lý đối với file (txt,ini...) mình nhờ các bác giải thích dòng lệnh sau với, vì rất hay bị lỗi bởi đoạn code này mà chưa biết cách xử lý như thế nào,hiện tại máy mình chạy WinXP-SP3, Office 2003-SP3 không biết làm từ 2003 mà chuyển sang Office2007 thì sẽ bị lỗi như thế nào và làm sao xử lý:

.
Refresh BackgroundQuery:=False

C
ảm ơn mọi người trước nha !!!
 
Upvote 0
Tham khảo code của các mem post về xử lý đối với file (txt,ini...) mình nhờ các bác giải thích dòng lệnh sau với, vì rất hay bị lỗi bởi đoạn code này mà chưa biết cách xử lý như thế nào,hiện tại máy mình chạy WinXP-SP3, Office 2003-SP3 không biết làm từ 2003 mà chuyển sang Office2007 thì sẽ bị lỗi như thế nào và làm sao xử lý:

.
Refresh BackgroundQuery:=False

C
ảm ơn mọi người trước nha !!!

Cái này mà bạn gọi là đoạn code à, bạn đưa cả thủ tục hoặc hàm hoặc cả file lên đi chớ đưa một câu vậy ai biết đâu mà trả lời. Bởi vì cũng câu lệnh đó nhưng nằm chổ này thì không lỗi, nhưng nằm chổ khác có thể gây lỗi.
 
Upvote 0
oke bạn :

Sub Read_Data()
Dim tenfile As String
tenfile = "test.ini"
Range("A55").Select
Selection.ClearContents
With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Windows\" & tenfile, _
Destination:=Range("A55"))
.Name = "test"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub
 
Upvote 0
Mình là dân mới học lập trình VBA, nhiều thứ cũng tự mò. Mình muốn dùng code để chèn tự động 1 hình ảnh vào 1 ô Excel.
PHP:
Public Function InsertPicture() As Object
InsertPicture = Sheet1.Pictures.Insert("Penguins.jpg")
With Pic
.Top = Sheet1.Cells(48, 4).Top
.Left = Sheet1.Cells(48, 4).Left
End With
End Function
Ở trên ô Excel, mình gõ InsertPicture() thì nó bị #VALUE!
Vậy đoạn code của mình bị sai chỗ nào? Mong các bạn giúp đỡ.
File đính kèm: http://www.mediafire.com/?w2m7nqu3kjf5u6k
Tóm lại: Hàm tự tạo không thể làm nhiệm vụ chèn hình, format gì được đâu... trừ trường hợp hình ấy chèn vào 1 comment
 
Upvote 0
oke bạn :

Sub Read_Data()
Dim tenfile As String
tenfile = "test.ini"
Range("A55").Select
Selection.ClearContents
With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\W indows\" & tenfile, _
Destination:=Range("A55"))
.Name = "test"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub
Có hai khả năng:
1. Câu lệnh này dư một dấu cách trong chữ W indows: With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\W indows\" & tenfile, _
Destination:=Range("A55"))

2. Không tồn tại File test trong thư mục Windows

Nói chung là lỗi không tồn tại file .ini
Mà dòng code nào thừa (mặc định rồi) thì dọn bớt đi cho gọn
 
Upvote 0
Có hai khả năng:
1. Câu lệnh này dư một dấu cách trong chữ W indows: With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\W indows\" & tenfile, _
Destination:=Range("A55"))

2. Không tồn tại File test trong thư mục Windows

Nói chung là lỗi không tồn tại file .ini
Mà dòng code nào thừa (mặc định rồi) thì dọn bớt đi cho gọn

Cảm ơn bạn đã hồi âm.
- Vấn đề 1 do mình khi post lên gõ thiếu
- Vấn đề 2 : file *.ini hoặc (*.txt) mình đã có sẵn trong thư mục C:\Windows rồi.
- Vì khi bị lỗi thì nó đánh dấu ở dòng này nên muốn hỏi ý nghĩa của dòng lệnh này,( .Refresh BackgroundQuery:=False : bỏ quả Refresh_ có phải vậy kg? ) có thể bỏ nó được kg?
 
Upvote 0
trong đoạn Code của thày Ndu, tôi chưa hiểu được bản chất của việc sử dụng Dictionary lắm, nhờ mọi người giúp hộ, cụ thể đoạn Code sau:

PHP:
Sub Test()
  Dim Arr1(1 To 4), Arr2, Dic1, i As Long
  Arr1(1) = "a"
  Arr1(2) = "b"
  Arr1(3) = "c"
  Arr1(4) = "d"
  Set Dic1 = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(Arr1)
    If Not Dic1.Exists(Arr1(i)) Then Dic1.Add Arr1(i), Asc(Arr1(i))
  Next
  Arr2 = Dic1.Keys
  MsgBox Arr2(0)
  MsgBox Arr2(1)
  MsgBox Dic1.Item("a")
  MsgBox Dic1.Item("b")
End Sub
tôi chưa hiểu lắm cái đuôi Asc(Arr1(i) là cái gì, khi tôi bấm chạy F5 kết quả hai giá trị cuối cùng là 97, 98 là do ở đâu mà có nó?
 
Upvote 0
trong đoạn Code của thày Ndu, tôi chưa hiểu được bản chất của việc sử dụng Dictionary lắm, nhờ mọi người giúp hộ, cụ thể đoạn Code sau:

PHP:
Sub Test()
  Dim Arr1(1 To 4), Arr2, Dic1, i As Long
  Arr1(1) = "a"
  Arr1(2) = "b"
  Arr1(3) = "c"
  Arr1(4) = "d"
  Set Dic1 = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(Arr1)
    If Not Dic1.Exists(Arr1(i)) Then Dic1.Add Arr1(i), Asc(Arr1(i))
  Next
  Arr2 = Dic1.Keys
  MsgBox Arr2(0)
  MsgBox Arr2(1)
  MsgBox Dic1.Item("a")
  MsgBox Dic1.Item("b")
End Sub
tôi chưa hiểu lắm cái đuôi Asc(Arr1(i) là cái gì, khi tôi bấm chạy F5 kết quả hai giá trị cuối cùng là 97, 98 là do ở đâu mà có nó?
Hàm Asc tương đương với hàm CODE của Excel ấy
Ví dụ:
Asc("a") = 97
và:
CODE("a") = 97
Nó trả về kết quả là 1 số nguyên đại diện cho MÃ CỦA KÝ TỰ
Thế thôi
 
Upvote 0
Hàm Asc tương đương với hàm CODE của Excel ấy
Ví dụ:
Asc("a") = 97
và:
CODE("a") = 97
Nó trả về kết quả là 1 số nguyên đại diện cho MÃ CỦA KÝ TỰ
Thế thôi

Thế làm sao để trả mã về được dạng này: ChrW(), giả sử muốn chữ Ô thành ChrW(xxx) thì phải làm sao?
 
Upvote 0
Hỏi về code để copy file từ thư mục này sang thu mục khác định trước.

chào các cao thủ, tôi thực ra không hiểu rõ về VBA nhưng có kiếm được trên diễn đàn đoạn code để xóa file trong một thu mục (thư mục này quản lý bằng excel). Nay tôi muốn thêm một nút bấm để copy file đã chọn sang thu mục khác. Mong các bác giúp đỡ, code như sau:

Private oFilePropReader As DSOleFile.PropertyReader
Private oDocProp As DSOleFile.DocumentProperties
Dim eFile As String, eFolderName As String
Dim stt As Integer

Private Sub CommandButton1_Click()
On Error Resume Next
Dim ewbName As String
Dim oCustProp As DSOleFile.CustomProperty
Set oFilePropReader = New DSOleFile.PropertyReader
eFolderName = Cells(4, 5)
stt = TextBox1.Text
ewbName = Cells(stt + 8, 3)
eFile = eFolderName & "\" & ewbName
Set oDocProp = oFilePropReader.GetDocumentProperties(eFile)
TextBox2.Text = oDocProp.Name
TextBox3.Text = oDocProp.Title
TextBox4.Text = oDocProp.Subject
TextBox5.Text = oDocProp.Author
TextBox6.Text = oDocProp.Category
TextBox7.Text = oDocProp.Manager
CommandButton2.Enabled = True
Set oDocProp = Nothing
End Sub
Private Sub CommandButton2_Click()
On Error Resume Next


Kill eFolderName & "\" & TextBox2.Text

TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
TextBox7.Text = ""

End Sub
Đoạn code này em muốn viết thành copy file đuọc chọn sang thu mục định sẵn (thư mục có thể là gán vào trong form hoặc 1 cell cho trước)
Private Sub CommandButton4_Click()
On Error Resume Next


Kill eFolderName & "\" & TextBox2.Text

TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
TextBox7.Text = ""

End Sub


Private Sub CommandButton3_Click()
UserForm1.Hide
End Sub
 
Upvote 0
Nhờ các AC giải thích giúp dòng code dưới giúp, thanks : (ReDim và UBound)

PHP:
ReDim Mg(1 To UBound(Vung) * 2, 1 To 32)
 
Upvote 0
Nhờ các AC giải thích giúp dòng code dưới giúp, thanks : (ReDim và UBound)

PHP:
ReDim Mg(1 To UBound(Vung) * 2, 1 To 32)


Với Vung là một mảng, ta ReDim lại mảng này thành mảng Mg

1 to UBound(Vung)* 2 là mảng bắt đầu từ 1 và có số dòng là số dòng của Vung nhân cho 2 (nếu số dòng của Vung là 10 thì số dòng của Mg là 20)

1 To 32 là số cột của mảng mới chạy từ cột thứ 1 đến cột thứ 32

Như vậy từ mảng Vung ban đầu đã chuyển đổi thành mảng Mg mới với số hàng bằng gấp hai lần số hàng của Vùng và số cột là 32.
 
Upvote 0
Mình có kiếm được đoạn Code để nhập số nguyên tự động chuyển thành số thập phân: Ví dụ nhập 55 chuyển thành 5.5
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
If Target.Value > 10 Then Target.Value = Target.Value / 10
End Sub
Nhưng như vậy thì nhập ở bất cứ đâu thì các số đều tự động chuyển hết
Vậy nhờ các bạn giúp mình thêm đoạn Code để chỉ được nhập trong một vùng tùy chọn?
 
Upvote 0
Bạn cần thêm dòng lệnh để khoanh vùng nơi nhập liệu, như

PHP:
 If Not Intersect(Taret, Columns("D:D")) Is Nothing then
    'Dòng Lệnh của bạn'

 End If

Bạn thử nghiệm với việc nhập vô cột 'D';

Sau khi nhuần nhuyễn, bạn sửa lại địa chỉ này thích hợp với trang nhập liệu của bạn.

(húc thành công!
 
Upvote 0
PHP:
 If Not Intersect(Taret, Columns("D:D")) Is Nothing then
    'Dòng Lệnh của bạn'

 End If

Bạn thử nghiệm với việc nhập vô cột 'D';

Sau khi nhuần nhuyễn, bạn sửa lại địa chỉ này thích hợp với trang nhập liệu của bạn.

(húc thành công!
Ui sao có phải vậy ko? Mình chỉ biết về hàm thôi, còn VBA này thì tịt, nên đặt thêm câu lệnh của bạn vào trên hay dưới If nó cũng ko chạy được, bạn giúp mình hoàn thành đoạn Code đó đi, mình đã làm vậy mà ko chạy!
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
If Not Intersect(Taret, Columns("D:D")) Is Nothing Then

If Target.Value > 10 Then Target.Value = Target.Value / 10

 End If
End Sub
 
Upvote 0
Ui sao có phải vậy ko? Mình chỉ biết về hàm thôi, còn VBA này thì tịt, nên đặt thêm câu lệnh của bạn vào trên hay dưới If nó cũng ko chạy được, bạn giúp mình hoàn thành đoạn Code đó đi, mình đã làm vậy mà ko chạy!
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
If Not Intersect([COLOR=#ff0000][B]Taret[/B][/COLOR], Columns("D:D")) Is Nothing Then

If Target.Value > 10 Then Target.Value = Target.Value / 10

 End If
End Sub
Bạn thử sửa chỗ màu đỏ thành Target xem có được không. Ngoài ra, thay Columns("D:D") bởi Sh.Columns("D:D") cho tường minh.
 
Upvote 0
Bạn thử sửa chỗ màu đỏ thành Target xem có được không. Ngoài ra, thay Columns("D:D") bởi Sh.Columns("D:D") cho tường minh.
Ngoài ra còn phải thêm Application.EnableEvents = False vào đầu code và Application.EnableEvents = True vào cuối code nữa mới chuẩn
 
Upvote 0
Ngoài ra còn phải thêm Application.EnableEvents = False vào đầu code và Application.EnableEvents = True vào cuối code nữa mới chuẩn
Bác Phúc và Bác Ndu ơi! Em cop đoạn code này mà sai ở đâu vậy? Nó chưa chịu chạy đâu, mong các bác giúp em chút đi!
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
On Error Resume Next
If Not Intersect(Target, Sh.Columns("D:D")) Is Nothing Then

If Target.Value > 10 Then Target.Value = Target.Value / 10
Application.EnableEvents = True
 End If
 
End Sub
 
Upvote 0
Bác Phúc và Bác Ndu ơi! Em cop đoạn code này mà sai ở đâu vậy? Nó chưa chịu chạy đâu, mong các bác giúp em chút đi!
Mã:
[B][COLOR=#ff0000]Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)[/COLOR][/B]
Application.EnableEvents = False
On Error Resume Next
If Not Intersect(Target, Sh.Columns("D:D")) Is Nothing Then

If Target.Value > 10 Then Target.Value = Target.Value / 10
Application.EnableEvents = True
 End If
 
End Sub

Cấu trúc câu lệnh của bạn sai chứ gì!

Mã:
[COLOR=#0000cd][B]Private Sub Worksheet_Change(ByVal Target As Range)[/B][/COLOR]
    If Not Intersect(Target, Columns("D:D")) Is Nothing Then
        If Target.Value > 10 Then Target.Value = Target.Value / 10
    End If
End Sub
 
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom