Chuyên đề giải đáp những thắc mắc về code VBA (2 người xem)

Liên hệ QC

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

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cảm ơn bác huuthang_bd nhưng em thử không được.

Thử ngược lại với bài trên xem sao, có thể bạn huuthang_bd viết nhầm;
PHP:
Sub Chen_dong_DMCV()
    ActiveSheet.UnProtect Password:="Password của bạn"
    ...
    ActiveSheet.Protect Password:="Password của bạn"
End Sub

Muốn vậy thì bạn phải có lệnh mở khóa ở đầu thủ tục và khóa lại ở cuối thủ tục
PHP:
Sub Chen_dong_DMCV()
    ActiveSheet.Protect Password:="Password của bạn"
    ...
    ActiveSheet.Unprotect Password:="Password của bạn"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chuẩn luôn bác Ba tê, em làm được rồi. Thanks bác nhiều }}}}}
 
Upvote 0
Thử ngược lại với bài trên xem sao, có thể bạn huuthang_bd viết nhầm;
PHP:
Sub Chen_dong_DMCV()
    ActiveSheet.UnProtect Password:="Password của bạn"
    ...
    ActiveSheet.Protect Password:="Password của bạn"
End Sub
Đúng là nhầm, do không test nên không phát hiện ra.
 
Upvote 0
Nhu cầu của mình là muốn tạo listbox chỉ cho nhập tên theo DS cho trước. Và khi gõ 1 vài kí tự nào đó thì Drop down list chỉ hiển thị những sản phẩm bắt đầu bằng kí tự mà mình vừa gõ. Mình tìm được file tương tự nhu cầu của mình. Tuy nhiên như cầu của mình là mỗi tháng sẽ làm 1 sheet nhập tên SP: VD: thay vì chỉ nhập trong sheet 1 như file đính kèm thì mình sẽ làm sheet tháng 1, tháng 2.....bạn nào giúp mình với ạ. mà mình cũng không biết làm sao để có thể ra cái listbox như file đính kèm. Bạn nào tốt bụng chỉ dẫn giúp mình nhé. Mình cám ơn rất nhiều
 

File đính kèm

Upvote 0
Mã:
Private Sub cmdThem_Click()Dim RowCount As Long
Dim ctl As Control
Worksheets("DATA").Range("B17:H17").ClearContents
'Write data to worksheet
RowCount = Worksheets("DATA").Range("B16").CurrentRegion.Rows.Count
With Worksheets("DATA").Range("B16")
.Offset(RowCount, 0).Value = Me.cbxNguoinhanBC.Value
.Offset(RowCount, 1).Value = Me.txtNguoilapBC.Value
.Offset(RowCount, 2).Value = Me.txtNguoiduyetBC.Value
.Offset(RowCount, 3).Value = Me.cbxChucdanhduyetBC.Value
.Offset(RowCount, 4).Value = Me.txtNgaylapBC.Value
.Offset(RowCount, 5).Value = Me.txtSothangBC.Value
.Offset(RowCount, 6).Value = Me.txtThoigianBC.Value
End With
Unload Me
End Sub

Đây là Code để nhập dữ liệu từ Form, nhưng có hạn chế là khi Click nút nhập thì phải nhập đầy đủ tất cả thông tin ở các Cell, nếu ô nào ko nhập thì Code xóa luôn thông tin cũ và Cell đó rỗng

Nhu cầu của mình là muốn sửa đoạn code để nếu chỉ cần cập nhật thông tin cho một Cell nào đó thì chỉ có tác dụng ở Cell ấy, các Cell khác giữ nguyên thông tin cũ, hoặc nếu cần nhập tất cả Thông tin mới thì nhập tất cả để thay đổi tất cả các Cell

Hoặc nhờ mọi người có thể sửa Code theo cách: khi mở Form thì sẽ hiện những thông tin của các Cell hiện có, nếu cần thay đổi thông tin ở Cell nào thì thay đổi, nếu kiểm tra không cần phải thay đổi thông tin gì thì End Sub vẫn giữ lại các thông tin như cũ
 
Upvote 0
Mã:
Private Sub cmdThem_Click()Dim RowCount As Long
Dim ctl As Control
Worksheets("DATA").Range("B17:H17").ClearContents
'Write data to worksheet
RowCount = Worksheets("DATA").Range("B16").CurrentRegion.Rows.Count
With Worksheets("DATA").Range("B16")
.Offset(RowCount, 0).Value = Me.cbxNguoinhanBC.Value
.Offset(RowCount, 1).Value = Me.txtNguoilapBC.Value
.Offset(RowCount, 2).Value = Me.txtNguoiduyetBC.Value
.Offset(RowCount, 3).Value = Me.cbxChucdanhduyetBC.Value
.Offset(RowCount, 4).Value = Me.txtNgaylapBC.Value
.Offset(RowCount, 5).Value = Me.txtSothangBC.Value
.Offset(RowCount, 6).Value = Me.txtThoigianBC.Value
End With
Unload Me
End Sub

Đây là Code để nhập dữ liệu từ Form, nhưng có hạn chế là khi Click nút nhập thì phải nhập đầy đủ tất cả thông tin ở các Cell, nếu ô nào ko nhập thì Code xóa luôn thông tin cũ và Cell đó rỗng

Nhu cầu của mình là muốn sửa đoạn code để nếu chỉ cần cập nhật thông tin cho một Cell nào đó thì chỉ có tác dụng ở Cell ấy, các Cell khác giữ nguyên thông tin cũ, hoặc nếu cần nhập tất cả Thông tin mới thì nhập tất cả để thay đổi tất cả các Cell

Hoặc nhờ mọi người có thể sửa Code theo cách: khi mở Form thì sẽ hiện những thông tin của các Cell hiện có, nếu cần thay đổi thông tin ở Cell nào thì thay đổi, nếu kiểm tra không cần phải thay đổi thông tin gì thì End Sub vẫn giữ lại các thông tin như cũ

Bạn không đính kèm file, biết giúp bạn bằng cách nào đây ???
 
Upvote 0
E có đoạn code sau. Xin nhờ các AC giải thích giúp em dòng 16 với ạ. E cảm ơn
Mã:
1.Sub ThemDongMoi()
2.    Dim Rng As Long
3.    Dim LastRow As Long
4.   Application.DisplayAlerts = False
5.    On Error Resume Next
6.    Rng = InputBox("Xin moi nhap so dong can Insert.")
7.    On Error GoTo 0
8.    Application.DisplayAlerts = True
9.    If Rng = 0 Then
10.        MsgBox "Ban da khong chon dong nao"
11.       Exit Sub
12.    Else
13.        Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(Rng, 0)).Select
14.       Selection.EntireRow.Insert
15.    End If
[B]16.    LastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row[/B]
17.   Range("B2:B" & LastRow).FillDown
18.    Range("E2:E" & LastRow).FillDown


19. End Sub
 
Upvote 0
E có đoạn code sau. Xin nhờ các AC giải thích giúp em dòng 16 với ạ. E cảm ơn
Mã:
1.Sub ThemDongMoi()
2.    Dim Rng As Long
3.    Dim LastRow As Long
4.   Application.DisplayAlerts = False
5.    On Error Resume Next
6.    Rng = InputBox("Xin moi nhap so dong can Insert.")
7.    On Error GoTo 0
8.    Application.DisplayAlerts = True
9.    If Rng = 0 Then
10.        MsgBox "Ban da khong chon dong nao"
11.       Exit Sub
12.    Else
13.        Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(Rng, 0)).Select
14.       Selection.EntireRow.Insert
15.    End If
[B]16.    LastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row[/B]
17.   Range("B2:B" & LastRow).FillDown
18.    Range("E2:E" & LastRow).FillDown


19. End Sub

Mình xin nói theo ý hiểu của mình :
Tìm ký tự * trong vùng Cells với: SearchOrder (thứ tự tìm kiếm): xlByRows (theo thứ tự dòng) , SearchDirection ( Hướng tìm kiếm) :

xlPrevious (Tìm trước đó), .Row thì để trả về dòng chứa ký tự đó. Đó mình hiểu được nhiêu đó thôi, có chổ nào sai mong các bạn và anh chị góp

ý...
 
Lần chỉnh sửa cuối:
Upvote 0
Không phải là đi tìm ký tự *, mà * chỉ là ký tự đại diện (cái này trong excel có lẻ Phong hiểu). Bạn tìm đọc cách xài Phương thức Find trong Vba sẽ rõ ngay....
Vì là ký tự đại diện, nên khi Find nó sẽ tìm ra bất kỳ ký tự hay chữ gì thuộc Cells nào cuối cùng và dùng Row để lấy ra số hàng cuối...mục đích là vậy đó.

Thế như trường hợp mà ta muốn đi tìm ký tự * thật thì thế nào anh ?
 
Upvote 0
Mình có 1 file đang gồm có 2 sheet , sheet1 là sheet he thong chứa số cont của hệ thống cập nhật vào , sheet 2 là sheet nhân viên gõ vào , mình cần so sánh để tìm ra những số cont mà sheet 2 có nhưng trong sheet 1 không có và cho những số cont sai đó vào một sheet khác..làm bằng vba để nhẹ chương trình và không phức tạp quá với người dùng khác
Mình chỉ đưa file mình hoạ vì file thực tế rất nặng và liên quan đến dữ liệu cảng ....
Mình xin cảm ơn!!! Mong ae nhiệt tình giúp đỡ mình không đc học vba
 
Upvote 0
Cái ni dễ hiểu nhứt nè; Nếu không chạy lẹ sẽ thay cái khác

[Thongbao]Xin lỗi minhh quên chuưa gửi file test[/Thongbao]
PHP:
Option Explicit
Sub Tìm1()
 Dim Tmr As Double
 Dim Cls As Range, Sh As Worksheet, Rng As Range, sRng As Range
 
 Tmr = Timer()
 Set Sh = ThisWorkbook.Worksheets("hethong")
 Set Rng = Sh.Range(Sh.[b1], Sh.[b1].End(xlDown))
 Sheets("thucte").Select
 [d2].CurrentRegion.ClearContents
 For Each Cls In Range([b2], [b2].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        Cls.Interior.ColorIndex = 38
        [d65500].End(xlUp).Offset(1).Value = Cls.Value
    End If
 Next Cls
 [d1].Value = Timer() - Tmr
End Sub
 
Upvote 0
Mai đến cơ quan mình sẽ test thử.cảm ơn bạn nhiều
 
Upvote 0
Mong A/C giải thích giúp Em đoạn code dưới đây. Cám ơn A/C!

Mã:
Private Sub Worksheet_Activate()
Dim sArr(), I&, Dic As Object, dArr, K&, Tmp
With Sheet1
    sArr = .Range(.[A2], .[A65000].End(3)).Resize(, 7).Value
End With
[COLOR=#000000]ReDim dArr(1 To UBound(sArr), 1 To UBound(sArr, 2)) [/COLOR] [COLOR=#0000FF]'ghi chú giúp em đoạn này có ý nghĩa gì?[/COLOR]
[COLOR=#000000]Set Dic = CreateObject("Scripting.Dictionary") [/COLOR]  [COLOR=#0000FF] 'lệnh CreateObject thường dùng để làm gì[/COLOR]
With Dic
    For I = 1 To UBound(sArr, 1)     [COLOR=#0000FF]'UBound(sArr, 1) ?[/COLOR]
        Tmp = sArr(I, 1)
        If Not .Exists(Tmp) Then
            K = K + 1   [COLOR=#0000FF]'Giúp em ???[/COLOR]
            .Add Tmp, K     [COLOR=#0000FF]'Giúp em ???[/COLOR]
                dArr(K, 1) = sArr(I, 1)     [COLOR=#0000FF]'Giúp em ???[/COLOR]
                dArr(K, 2) = sArr(I, 7)      [COLOR=#0000FF]'Giúp em ???[/COLOR]
        Else
            dArr(.Item(Tmp), 2) = dArr(.Item(Tmp), 2) + sArr(I, 7)        [COLOR=#0000FF]'Giúp em ???[/COLOR]
        End If
    Next I
End With
With Sheet3
        .Range("A2:B65000").ClearContents
    If K Then
        .Range("A2").Resize(K, 2).Value = dArr
        .Range("A2").Resize(K, 2).Sort Sheet3.Range("A1"), xlAscending
    End If
End With
Set Dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
[Thongbao]Xin lỗi minhh quên chuưa gửi file test[/Thongbao]
PHP:
Option Explicit
Sub Tìm1()
 Dim Tmr As Double
 Dim Cls As Range, Sh As Worksheet, Rng As Range, sRng As Range
 
 Tmr = Timer()
 Set Sh = ThisWorkbook.Worksheets("hethong")
 Set Rng = Sh.Range(Sh.[b1], Sh.[b1].End(xlDown))
 Sheets("thucte").Select
 [d2].CurrentRegion.ClearContents
 For Each Cls In Range([b2], [b2].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        Cls.Interior.ColorIndex = 38
        [d65500].End(xlUp).Offset(1).Value = Cls.Value
    End If
 Next Cls
 [d1].Value = Timer() - Tmr
End Sub
Bạn ơi mình bỏ cái vba này vào sheet in ra danh sách thì bị lỗi , nó khựng máy lại. còn bỏ vào cái sheet <thực tế> thì ra thế này
Capture.JPG
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có cần phải trích dẫn & nêu đích thị là code của ai không? Bạn chỉ cần copy và trích dẫn code như này. Chỗ nào chưa hiểu mòng A/C giải thích giúp. Tôi hay ai đó không thích điều này....đâu. Vậy tôi sẽ không tham gia..

P/s: trước khi muốn tìm hiểu code hãy đi tìm hiểu cái cơ bản về VBA đi đã. Hãy học bơi trước khi nhảy xuống nước, vì có muốn bơi ra giữa dòng cũng phải bơi từ bờ mới ra...tới giữa dòng....

Okie Anh. Em sợ dùng code ko xin phép, A con giận thì chít Em. Cho Em xin lỗi nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Mong A/C giải thích giúp Em đoạn code dưới đây. Cám ơn A/C!
'lệnh CreateObject thường dùng để làm gì ? nó dùng tạo ra đối tượng DIC

'UBound(sArr, 1) tìm độ lớn(chỉ số trên) chiều thứ nhất của mảng

những cái bên dưới là cách người ta làm, có thể mỗi người một kiểu không thể chỉ được, nó phải cần có thời gian để hiểu

 
Lần chỉnh sửa cuối:
Upvote 0
Bạn ơi mình bỏ cái vba này vào cái sheet <thực tế> thì ra thế này
View attachment 150320

Đó là kết quả đúng mà, fải vậy không?
Những ô mà macro tô màu ở cột là những ô chứa giá trị không được tìm thấy ở trang bên & giá trị ô màu này cũng được macro lần lượt ghi ở cột [D], bắt đầu từ [D2];
Còn [D1] để ghi lại thời gian tiêu tốn cho macro.

Nhưng nên bỏ macro vô module1
 
Upvote 0
Nhờ anh chị giùm em cái này với ạ . Em viết một cái hàm function để tính giá trị SPL cho bài này. Do em phải chạy rất nhiều trường hợp, mà cứ mỗi lần chạy trường hợp nào là em phải viết lại cách tính này, chỉ đổi giá trị i và các cột tương ứng thôi. Giờ em muốn viết một hàm bao gồm cho tất cả các trường hợp ạ. Mong anh chị giúp đỡ

For i = 18 To 31

frequency = Cells(i, 1)
lambda = sv / frequency
Fresnel_number = 2# * delta / lambda
Call Attenuation_by_Diffraction(Fresnel_number, Att_Diff)

Cells(i, 3) = Cells(i, 2).Value + Cells(12, 2).Value
Cells(i, 4) = Fresnel_number
Cells(i, 5) = Att_Diff

SPL = Att_Diff + Cells(i, 3).Value

Cells(i, 6) = SPL

Next i
 
Upvote 0
Nhờ anh chị giùm em cái này với ạ . Em viết một cái hàm function để tính giá trị SPL cho bài này. Do em phải chạy rất nhiều trường hợp, mà cứ mỗi lần chạy trường hợp nào là em phải viết lại cách tính này, chỉ đổi giá trị i và các cột tương ứng thôi. Giờ em muốn viết một hàm bao gồm cho tất cả các trường hợp ạ. Mong anh chị giúp đỡ

For i = 18 To 31

frequency = Cells(i, 1)
lambda = sv / frequency
Fresnel_number = 2# * delta / lambda
Call Attenuation_by_Diffraction(Fresnel_number, Att_Diff)

Cells(i, 3) = Cells(i, 2).Value + Cells(12, 2).Value
Cells(i, 4) = Fresnel_number
Cells(i, 5) = Att_Diff

SPL = Att_Diff + Cells(i, 3).Value

Cells(i, 6) = SPL

Next i

 
Upvote 0
Em viết một cái hàm function để tính giá trị SPL cho bài này. Do em phải chạy rất nhiều trường hợp, mà cứ mỗi lần chạy trường hợp nào là em phải viết lại cách tính này, chỉ đổi giá trị i và các cột tương ứng thôi. Giờ em muốn viết một hàm bao gồm cho tất cả các trường hợp ạ. Mong anh chị giúp đỡ

Giống như bạn bơi đã ra giữa sông, thấy đuối nên kêu cứu thì fải
Có lẽ ta fải quay lại từ đầu & mô tả công việc lại 1 cách rõ ràng mới được;
Mà bạn có lẫn lộn giữa 1 Sub hay 1 hàm (Function) không đấy?
 
Upvote 0
Giống như bạn bơi đã ra giữa sông, thấy đuối nên kêu cứu thì fải
Có lẽ ta fải quay lại từ đầu & mô tả công việc lại 1 cách rõ ràng mới được;
Mà bạn có lẫn lộn giữa 1 Sub hay 1 hàm (Function) không đấy?

Chính xác là em đang bị mắc giữa dòng đây bác ạ. -\\/.
Em đang viết sub để tính giá trị SPL (các cột được tô xanh) cho 4 trường hợp. Cách tính thì y chang giống nhau mà chỉ khác địa chỉ các ô thôi. Em đang nghĩ đến việc viết một cái funtion để ap dụng cho cả 4 trường hợp. Đặc biết là đoạn code ở trên, làm sao để đoạn code này không phải lặp lại dài dòng cho cả mấy trường hợp như vậy ạ. Ý là làm một cái funtion cho đoạn sub ngắn lại thì tốt quá
Bác quăng phao cho em với ạ.

Em gửi file đính kèm bác mở ra là hiểu liền ạ .
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ anh chị giùm em cái này với ạ . Em viết một cái hàm function để tính giá trị SPL cho bài này. Do em phải chạy rất nhiều trường hợp, mà cứ mỗi lần chạy trường hợp nào là em phải viết lại cách tính này, chỉ đổi giá trị i và các cột tương ứng thôi. Giờ em muốn viết một hàm bao gồm cho tất cả các trường hợp ạ. Mong anh chị giúp đỡ

For i = 18 To 31

frequency = Cells(i, 1)
lambda = sv / frequency
Fresnel_number = 2# * delta / lambda
Call Attenuation_by_Diffraction(Fresnel_number, Att_Diff)

Cells(i, 3) = Cells(i, 2).Value + Cells(12, 2).Value
Cells(i, 4) = Fresnel_number
Cells(i, 5) = Att_Diff

SPL = Att_Diff + Cells(i, 3).Value

Cells(i, 6) = SPL

Next i


Với code trên thì không thể làm được. Trong code bạn có lấy giá trị của ô [12,2]. Nếu đổi giá trị i (18-31) sang cái gì đó thì phải biết nó có ảnh hưởng đến [12,2] hay không.
 
Upvote 0
Đó là kết quả đúng mà, fải vậy không?
Những ô mà macro tô màu ở cột là những ô chứa giá trị không được tìm thấy ở trang bên & giá trị ô màu này cũng được macro lần lượt ghi ở cột [D], bắt đầu từ [D2];
Còn [D1] để ghi lại thời gian tiêu tốn cho macro.

Nhưng nên bỏ macro vô module1

Cảm ơn bạn đã giúp đỡ nhưng mình muốn cho nó tô màu và tự chèn vào 1 sheet khác 2 sheet đó để cho mọi người trong ca dễ hiểu hơn đc ko hả bạn ? Với lại với 4000 dòng thì liệu có bị chậm ko hả bạn ??
 
Upvote 0
Với code trên thì không thể làm được. Trong code bạn có lấy giá trị của ô [12,2]. Nếu đổi giá trị i (18-31) sang cái gì đó thì phải biết nó có ảnh hưởng đến [12,2] hay không.

Vậy ví dụ em bỏ luôn cái giá trị của ô [12,2] thì có viết được function không hả bác.
 
Upvote 0
function xyz(byval r1 as long, byval r2 as long) as double
...
for i = r1 to r2
...
next
...

Lưu y: code này thay đổi giá trị các cells trong sheet nên function chỉ có thể dùng sub khác để gọi, không thể làm hàm dùng trong worksheet.
 
Upvote 0
Cảm ơn bạn đã giúp, (2) mình muốn cho nó tô màu và tự chèn vào 1 sheet khác 2 sheet đó để cho mọi người trong ca dễ hiểu hơn đc ko hả bạn ?
(1) Với lại với 4000 dòng thì liệu có bị chậm ko hả bạn ??

(1) Nhanh chậm còn tùy thuộc cấu hình, số liệu & cấu trúc các trang tính của bạn;
Trong lệnh gần cuối macro, nó có ghi thời gian cần để nó hoàn tất mà. Căn cứ vô đó, nếu thấy ì ạch thì kêu lên; Sẽ có người tới cứu bạn khỏi sa lầy.

(2) Muốn nó ghi vào trang tính khác thì thêm tên cúng cơm của trang tính cần ghi vô dòng lệnh này:
Mã:
[FONT=Courier New][COLOR=#007700][[/COLOR][COLOR=#0000bb]d65500[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000bb]End[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]xlUp[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000bb]Offset[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000bb]Value [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]Cls[/COLOR][COLOR=#007700].[/COLOR][/FONT][COLOR=#0000bb][FONT=Courier New]Value [/FONT][/COLOR]

Ví dụ
PHP:
 Sheets("KQua").[d65500].End(xlUp).Offset(1).Value = Cls.Value

Chúc vui!

 
Upvote 0
Chính xác là em đang viết sub để tính giá trị SPL (các cột được tô xanh) cho 4 trường hợp. Cách tính thì y chang giống nhau mà chỉ khác địa chỉ các ô thôi. Em đang nghĩ đến việc viết một cái funtion để ap dụng cho cả 4 trường hợp.
Ý là làm một cái funtion cho đoạn sub ngắn lại thì tốt quá
Bác quăng phao cho em với ạ.
Em gửi file đính kèm bác mở ra là hiểu liền ạ .
Mình xin bạn nêu rõ ràng, rành mạch cái Sub lần nữa 1 cách tường minh:
PHP:
For i = 18 To 31
  frequency = Cells(i, 1)   
  lambda = sv / frequency   'SV này lấy ở đâu?'
  Fresnel_number = 2# * delta / lambda  ' Delta lấy từ đâu?'
 Call Attenuation_by_Diffraction(Fresnel_number, Att_Diff)  '. Tại (*) & tham biến sau lấy từ đâu'
 Cells(i, 3) = Cells(i, 2).Value + Cells(12, 2).Value
 Cells(i, 4) = Fresnel_number
 Cells(i, 5) = Att_Diff
SPL = Att_Diff + Cells(i, 3).Value

Cells(i, 6) = SPL
Next i

(*)
Mã:
Sub Attenuation_by_Diffraction(n As Double, dL As Double)
 If n >= 1# Then dL = -10# * Log10(n / 5#) - 20#
 If n < 1# And n >= 0.1 Then dL = -4.97 * Log10(n) - 13.01
 If n < 0.1 And n >= 0.01 Then dL = -2.09 * Log10(n) - 10.12
 If Abs(n) < 0.01 Then dL = -77# * n - 5.17
 If n <= -0.01 And n > -0.3 Then dL = 10# * Log10(0.33 / (cuberoot(n) + 1#))
 If n <= -0.3 Then dL = 0#
End Sub
 
Upvote 0
Đoạn code dưới đây đang chạy lọc ngày duy nhất có sắp xếp theo thứ tự tăng dần. Lọc dữ liệu ngày từ cột A của sheet Data, sau đó lấy kết quả cho sang cột A của sheet Chart và tính tổng giá trị của cột B sheet Data rồi cho sang cột B sheet Chart. Nó chạy rất tốt rồi. Do có 1 sheet khác em cũng dùng code này nhưng ko cần phần tính tổng. Nên Em muốn nhờ A/C giúp Em sửa code. Bỏ phần tính tổng, chỉ giữ lại code lọc ngày duy nhất có sắp xếp tăng dần. Cám ơn A/C nhiều!


Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$1" Then
Dim sArr(), I&, J&, Dic As Object, dArr, K&, Tmp
With Sheet1
    sArr = .Range(.[A2], .[A65000].End(3)).Resize(, 2).Value
End With
ReDim dArr(1 To UBound(sArr), 1 To UBound(sArr, 2))
Set Dic = CreateObject("Scripting.Dictionary")
With Dic
    For I = 1 To UBound(sArr, 1)
        Tmp = sArr(I, 1)
        If Not .Exists(Tmp) Then
            K = K + 1
            .Add Tmp, K
            For J = 1 To UBound(sArr, 2)
                dArr(K, J) = sArr(I, J)
            Next J
        Else
            dArr(.Item(Tmp), 2) = dArr(.Item(Tmp), 2) + sArr(I, 2)
        End If
    Next I
End With
With Sheet3
        .Range("A2:B65000").ClearContents
    If K Then
        .Range("A2").Resize(K, 2).Value = dArr
        .Range("A2").Resize(K, 2).Sort Sheet3.Range("A1"), xlAscending
    End If
End With
Set Dic = Nothing
End If
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đoạn code dưới đây đang chạy lọc ngày duy nhất có sắp xếp theo thứ tự tăng dần. Lọc dữ liệu ngày từ cột A của sheet Data, sau đó lấy kết quả cho sang cột A của sheet Chart và tính tổng giá trị của cột B sheet Data rồi cho sang cột B sheet Chart. Nó chạy rất tốt rồi. Do có 1 sheet khác em cũng dùng code này nhưng ko cần phần tính tổng. Nên Em muốn nhờ A/C giúp Em sửa code. Bỏ phần tính tổng, chỉ giữ lại code lọc ngày duy nhất có sắp xếp tăng dần. Cám ơn A/C nhiều!


Mã:
Private Sub Worksheet_Change(ByVal Target As Range)If Target.Address = "$C$1" Then
Dim sArr(), I&, J&, Dic As Object, dArr, K&, Tmp
With Sheet1
    sArr = .Range(.[A2], .[A65000].End(3)).Resize(, 2).Value
End With
ReDim dArr(1 To UBound(sArr), 1 To UBound(sArr, 2))
Set Dic = CreateObject("Scripting.Dictionary")
With Dic
    For I = 1 To UBound(sArr, 1)
        Tmp = sArr(I, 1)
        If Not .Exists(Tmp) Then
            K = K + 1
            .Add Tmp, K
            For J = 1 To UBound(sArr, 2)
                dArr(K, J) = sArr(I, J)
            Next J
        Else
            dArr(.Item(Tmp), 2) = dArr(.Item(Tmp), 2) + sArr(I, 2)
        End If
    Next I
End With
With Sheet3
        .Range("A2:B65000").ClearContents
    If K Then
        .Range("A2").Resize(K, 2).Value = dArr
        .Range("A2").Resize(K, 2).Sort Sheet3.Range("A1"), xlAscending
    End If
End With
Set Dic = Nothing
End If
End Sub
Hên xui nha: Bạn thay vì cộng lại sẽ là gộp lại ngăn bởi dấu ; hoặc , sau đó split ra theo dấu ngăn (, hoặc ;) rồi sort theo hàng
 
Upvote 0
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$1" Then
Dim sArr(), I&, Dic As Object, dArr, K&, Tmp
With Sheet1
    sArr = .Range(.[A2], .[A65000].End(3)).Resize(, 2).Value
End With
ReDim dArr(1 To UBound(sArr), 1 To 1)
Set Dic = CreateObject("Scripting.Dictionary")
With Dic
    For I = 1 To UBound(sArr, 1)
        Tmp = sArr(I, 1)
        If Not .Exists(Tmp) Then
            K = K + 1
            .Add Tmp, K
                dArr(K, 1) = sArr(I, 1)
        End If
    Next I
End With
With Sheet3
        .Range("A2:A65000").ClearContents
    If K Then
        .Range("A2").Resize(K).Value = dArr
        .Range("A2").Resize(K).Sort Sheet3.Range("A1"), xlAscending
    End If
End With
Set Dic = Nothing
End If
End Sub

Em cám ơn Anh! Ok rồi Anh ơi /*+
 
Upvote 0
hỏi về hàm match tương đối,
xin chào mọi người, tôi có một vấn đề mò hoài mà nó vẫn ko ra kết quả+-+-+-++-+-+-++-+-+-+, nhờ anh chị giúp đỡ

có một cột ngày được sắp xếp theo thứ tự tăng dần, tuy nhiên các ngày thì có bị lặp lại
bị giờ đi tìm vị trí ngày ở cell C5 trừ đi 1
nếu dùng hàm match trên sheet thì kết quả tốt E5
nhưng hàm match trong code thì bị lổi
nhưng khi lấy c6=c5-1 thì code lại cho ra kết quả đúng
mọi người giúp với, làm sao khắc phục nó
cám ơn
 

File đính kèm

Upvote 0
hỏi về hàm match tương đối,
xin chào mọi người, tôi có một vấn đề mò hoài mà nó vẫn ko ra kết quả+-+-+-++-+-+-++-+-+-+, nhờ anh chị giúp đỡ

có một cột ngày được sắp xếp theo thứ tự tăng dần, tuy nhiên các ngày thì có bị lặp lại
bị giờ đi tìm vị trí ngày ở cell C5 trừ đi 1
nếu dùng hàm match trên sheet thì kết quả tốt E5
nhưng hàm match trong code thì bị lổi
nhưng khi lấy c6=c5-1 thì code lại cho ra kết quả đúng
mọi người giúp với, làm sao khắc phục nó
cám ơn

cái này là ai hỏi đây Let' Gâu Gâu ?
 
Upvote 0
cái này là ai hỏi đây Let' Gâu Gâu ?

thì gâu gâu hỏi chứ ai.........hihihihi
tôi đang làm giúp một bạn thì bị vấn đề này
tôi ra ngoài tạo lại một file mới thì thấy nó chạy được, riêng số liệu của file này thì cứ bị như vậy
kiểm tra rất kỹ, không thấy nó sai gì về định dạng ngày...........hihih.......hết cách.........lên đây cầu cứu các thầy
 
Upvote 0
thì gâu gâu hỏi chứ ai.........hihihihi
tôi đang làm giúp một bạn thì bị vấn đề này
tôi ra ngoài tạo lại một file mới thì thấy nó chạy được, riêng số liệu của file này thì cứ bị như vậy
kiểm tra rất kỹ, không thấy nó sai gì về định dạng ngày...........hihih.......hết cách.........lên đây cầu cứu các thầy
Hihi ở đâu vậy Gâu Gâu. Cho mình đường link để nếu giải xong rùi mình học tập. Hí hí
 
Upvote 0
thì gâu gâu hỏi chứ ai.........hihihihi
tôi đang làm giúp một bạn thì bị vấn đề này
tôi ra ngoài tạo lại một file mới thì thấy nó chạy được, riêng số liệu của file này thì cứ bị như vậy
kiểm tra rất kỹ, không thấy nó sai gì về định dạng ngày...........hihih.......hết cách.........lên đây cầu cứu các thầy

kiếm các thầy thì sao tôi dám trả lời ?
Public Sub hello()
MsgBox TypeName(Application.Match([C6].Value, [a1:a26], 0))
MsgBox TypeName(Application.Match([C6].Value2, [a1:a26], 0))
MsgBox TypeName(Application.Match([C6], [a1:a26], 0))
End Sub
 
Upvote 0
cái này là ai hỏi đây Let' Gâu Gâu ?

lý do làm cái việc đó là như vậy, dữ liệu rất lớn, có tới khoảng 5,6 chục ngàn dòng (một năm), vì vậy khi người ta muốn xử lý từ ngày ....đến ngày
tôi muốn nhảy tới dòng đó để nạp từ dòng đó đến cuối vào mảng
như vậy sẻ tiết kiệm bớt vòng lặp
DoveandRose, có nhiều kinh nghiệm trong việc xử lú số liệu lớn, góp ý mình với

kiếm các thầy thì sao tôi dám trả lời ?
Public Sub hello()
MsgBox TypeName(Application.Match([C6].Value, [a1:a26], 0))
MsgBox TypeName(Application.Match([C6].Value2, [a1:a26], 0))
MsgBox TypeName(Application.Match([C6], [a1:a26], 0))
End Sub

thì DoveAndRose đạt được đẳng cấp đó rồi còn gì nữa, thấy có quá chừng cô ngưỡng mộ
trong đó có em..........nữa
 
Lần chỉnh sửa cuối:
Upvote 0
lý do làm cái việc đó là như vậy, dữ liệu rất lớn, có tới khoảng 5,6 chục ngàn dòng (một năm), vì vậy khi người ta muốn xử lý từ ngày ....đến ngày
tôi muốn nhảy tới dòng đó để nạp từ dòng đó đến cuối vào mảng
như vậy sẻ tiết kiệm bớt vòng lặp
DoveandRose, có nhiều kinh nghiệm trong việc xử lú số liệu lớn, góp ý mình với



thì DoveAndRose đạt được đẳng cấp đó rồi còn gì nữa, thấy có quá chừng cô ngưỡng mộ
trong đó có em..........nữa

xem có 1 cột thật khó trả lời nên dùng cách nào , thường thì trên 20 000 dòng thì em nghỉ chơi Match rồi chứ đừng nói nhiều hơn
dùng mảng có thể là giải pháp tốt khi mà ngày đã xếp theo thứ tự , Nhưng cần có tí lắc léo
 
Upvote 0
Public Sub hello()
MsgBox TypeName(Application.Match([C6].Value, [a1:a26], 0))
MsgBox TypeName(Application.Match([C6].Value2, [a1:a26], 0))
MsgBox TypeName(Application.Match([C6], [a1:a26], 0))
End Sub

ủa sao cái nào nó cũng cho Error
ý bạn là sao?
tôi nghe nó value2 không sử dụng được cho date?
 
Upvote 0
giỡn chơi quài đại ka
đối với kiểu Date thì Match trong VBA chỉ nhận 2 kiểu
1 là .Value2
2 là Range
như vậy cái đầu sẽ là Error
2 cái sau là Double

ok, sorry, vì tôi sửa ngày mà ko để ý
=======
1-
lý do mà tôi không tìm chính xác là vì
vì ví dụ khi người ta nhập từ ngày 3/7/15, mà trong cột dữ liệu ko có ngày này (ngày đó nghỉ, ko có dữ liệu nhập) thì nó tìm được dòng cuối là ngày 2/7
=======
2-
cái dzụ value2, thì.........hihhihi, tôi học mò ko à, ko có rành lý thuyết, thấy trong help của excel nó viết như vậy
Mã:
The only difference between this property and the [B]Value[/B] property is  that the [B]Value2[/B] property doesn’t use the [B]Currency[/B] and [B]Date[/B]  data types. You can return values formatted with these data types as  floating-point numbers by using the [B]Double[/B] data type.
============
3-
nhưng mà như bạn nó quá 20 000 thì ko xài hàm match , vậy kế hoạch của tôi phá sản rồi
mà nghĩ cũng lạ hén, anh Bill này nâng số dòng của excel lên cho cố rồi xử lý không nổi.
===============
4-
tôi nhớ có lần bạn nói, giới hạn của mảng là bao nhiêu dòng vậy
 
Lần chỉnh sửa cuối:
Upvote 0
ok, sorry, vì tôi sửa ngày mà ko để ý
=======
1-
lý do mà tôi không tìm chính xác là vì
vì ví dụ khi người ta nhập từ ngày 3/7/15, mà trong cột dữ liệu ko có ngày này (ngày đó nghỉ, ko có dữ liệu nhập) thì nó tìm được dòng cuối là ngày 2/7
=======
2-
cái dzụ value2, thì.........hihhihi, tôi học mò ko à, ko có rành lý thuyết, thấy trong help của excel nó viết như vậy
Mã:
The only difference between this property and the [B]Value[/B] property is  that the [B]Value2[/B] property doesn’t use the [B]Currency[/B] and [B]Date[/B]  data types. You can return values formatted with these data types as  floating-point numbers by using the [B]Double[/B] data type.
============
3-
nhưng mà như bạn nó quá 20 000 thì ko xài hàm match , vậy kế hoạch của tôi phá sản rồi
mà nghĩ cũng lạ hén, anh Bill này nâng số dòng của excel lên cho cố rồi xử lý không nổi.
===============
4-
tôi nhớ có lần bạn nói, giới hạn của mảng là bao nhiêu dòng vậy

dữ liệu ngày xếp thứ tự rồi thì cho dù tìm cần dò tìm không chính xác thì cách dùng mảng vẫn làm được chứ .
em khác gì anh , cũng toàn đi học lỏm , em thấy như vầy
giá trị thật của 1 ô có format ngày thật ra là giá trị của ô đó khi Format là General
khi gặp .Value excel check xem ô đó có Format ngày hay không ? nếu có thì nó lấy giá trị ô đó rồi cố gắng cast về dạng ngày tháng
còn khi gặp .Value2 thì excel chỉ lấy giá trị thật của ô đó là xong
Bill nâng số dòng của excel lên nhiều vì Bill biết ngoài cách dùng hàm Match ra còn nhiều cách khác lợi hại hơn để làm việc với dữ liệu lớn , và Bill cũng muốn thử tài các lập trình viên VBA đó mà . ha ha
giới hạn của mảng tùy vào máy 32 bit hay 64 bit , con số cụ thể thì để các nhà bác học trên GPE trả lời
dân đen chúng ta chỉ cần gán giá trị trên sheet xuống mảng , khi nào thấy nó la làng lên
OVER FLOW thì lúc đó tự hiểu là phải giảm số dòng xuống
đối với dữ liệu khoảng 60 000 dòng và dưới 30 cột thì không cần lo về vấn đề giới hạn mảng
 
Upvote 0
Chào các anh chị,
em có đoạn code chạy lần đầu không bị lỗi, nhưng chạy lần 2 thì bị lỗi.
Mong các anh chị GPE xem và chỉnh sửa giúp ạ
em có đính kèm file cho mọi người dễ kiểm tra nhé

Mã:
Sub copy_sheet()
Worksheets("Cycle form").Activate
ActiveWorkbook.Worksheets("Cycle form").Copy
ActiveSheet.Range([D6], [H65536].End(xlUp)).Select
Selection.Copy
ActiveWorkbook.Worksheets("Cycle form").Range("D6:H13").PasteSpecial xlValues
Dim ShName As String, MyFileName As String
ShName = "Cycle form"
MyFileName = Range("R1")
ActiveWorkbook.SaveAs Filename:=Worksheets(ShName).[Q1] & MyFileName & ".xls"
End Sub
 

File đính kèm

Upvote 0
Chào các anh chị,
em có đoạn code chạy lần đầu không bị lỗi, nhưng chạy lần 2 thì bị lỗi.
Mong các anh chị GPE xem và chỉnh sửa giúp ạ
em có đính kèm file cho mọi người dễ kiểm tra nhé

Mã:
Sub copy_sheet()
Worksheets("Cycle form").Activate
ActiveWorkbook.Worksheets("Cycle form").Copy
ActiveSheet.Range([D6], [H65536].End(xlUp)).Select
Selection.Copy
ActiveWorkbook.Worksheets("Cycle form").Range("D6:H13").PasteSpecial xlValues
Dim ShName As String, MyFileName As String
ShName = "Cycle form"
MyFileName = Range("R1")
ActiveWorkbook.SaveAs Filename:=Worksheets(ShName).[Q1] & MyFileName & ".xls"
End Sub
Lỗi là đúng thôi.
chạy code đầu tiên thì Myfilename được lưu trong thư mục.
chạy code lần 2 myfilename có rồi thì sao lưu đè lên được.
nếu muốn lưu đè lên thì bạn cho cặp này ở đầu và cuối code:
Application.Displayalert= False
...
Application.displayalert= true
 
Upvote 0
Sub copy_sheet()
Worksheets("Cycle form").Activate
ActiveWorkbook.Worksheets("Cycle form").Copy
ActiveSheet.Range([D6], [H65536].End(xlUp)).Select
Selection.Copy
ActiveWorkbook.Worksheets("Cycle form").Range("D6:H13").PasteSpecial xlValues
Dim ShName As String, MyFileName As String
ShName = "Cycle form"
MyFileName = Range("R1")
ActiveWorkbook.SaveAs Filename:=Worksheets(ShName).[Q1] & MyFileName & ".xls"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Lỗi là đúng thôi.
chạy code đầu tiên thì Myfilename được lưu trong thư mục.
chạy code lần 2 myfilename có rồi thì sao lưu đè lên được.
nếu muốn lưu đè lên thì bạn cho cặp này ở đầu và cuối code:
Application.Displayalert= False
...
Application.displayalert= true

Em đã làm theo hướng dẫn nhưng vẫn bị lỗi anh ơi, anh xem lại giúp em với
Mã:
Sub copy_sheet()
Application.displayalert = False
Dim ShName As String, MyFileName As String
Worksheets("Cycle form").Activate
ActiveWorkbook.Worksheets("Cycle form").Copy
ActiveSheet.Range([D6], [H65536].End(xlUp)).Select
Selection.Copy
ActiveWorkbook.Worksheets("Cycle form").Range("D6:H13").PasteSpecial xlValues
ShName = "Cycle form"
MyFileName = Range("R1")
ActiveWorkbook.SaveAs Filename:=Worksheets(ShName).[Q1] & MyFileName & ".xls"
Application.displayalert = True
End Sub
 
Upvote 0
Lỗi là đúng thôi.
chạy code đầu tiên thì Myfilename được lưu trong thư mục.
chạy code lần 2 myfilename có rồi thì sao lưu đè lên được.
nếu muốn lưu đè lên thì bạn cho cặp này ở đầu và cuối code:
Application.Displayalert= False
...
Application.displayalert= true

Application.displayalerts
 
Upvote 0
Mong được sự giúp đỡ của các anh chị. em xin cám ơn!
Range("Q" & Worksheets("KEHOACH").Cells(1, 1)).FormulaArray = _
"=IF(RC12="""",0,SUM(IF(RC12=XUATTP!R4C4:R50000C4,1,0)*IF(RC13=XUATTP!R4C5:R50000C5,1,0)*IF(RC6=XUATTP!R4C6:R50000C6,1,0)*IF(RC14=XUATTP!R4C9:R50000C9,1,0)*IF(RC15=XUATTP!R4C11:R50000C11,1,0)*XUATTP!R4C12:R50000C12))"
Range("Q" & Worksheets("KEHOACH").Cells(1, 1) & ":Q" & Worksheets("KEHOACH").Cells(1, 2)).FillDown
ActiveSheet.Calculate
Range("Q" & Worksheets("KEHOACH").Cells(1, 1) & ":Q" & Worksheets("KEHOACH").Cells(1, 2)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Nhờ anh chị giải thíc vì em chưa hiểu một số câu lệnh trong đoạn code trên :(:
- "=IF(RC12="""",0, ƠO em chưa hiểu ("""") có nghĩa là gì, sau đó sao lại là số 0
- SUM(IF(RC12=XUATTP!R4C4:R50000C4,1,0) cÂU LỆNH NÀY LIÊN KẾT ĐẾN SHEET KHÁC ĐÚNG KHÔNG Ạ
- *IF( Dấu * ở đây có nghĩa là gì ?
- Range("Q" & Worksheets("KEHOACH").Cells(1, 1)) âu Câu lệnh này có phải chọn cột Q tại sheets kế hoạch không ạ
- Nếu e muốn tính tộng có điệu kiện các dòng của sheet2 đổ về các dòng tương ứng điều kiện của sheets1 thi e phải làm sao.
Xian chân thành cảm ơn các anh chị
 
Upvote 0
Nhờ anh chị giải thíc vì em chưa hiểu một số câu lệnh trong đoạn code trên :(:
- "=IF(RC12="""",0, ƠO em chưa hiểu ("""") có nghĩa là gì, sau đó sao lại là số 0
1/"""" tương đương với để trống, khi bạn xài công thức trực tiếp ở ngoài sheet thì là "" (Tức là khi dữ liệu trong cell mà trống thì lấy 0)
- SUM(IF(RC12=XUATTP!R4C4:R50000C4,1,0) cÂU LỆNH NÀY LIÊN KẾT ĐẾN SHEET KHÁC ĐÚNG KHÔNG Ạ
Theo bạn hiểu liên kết có nghĩa là gì? Chỗ tô đỏ là điều kiện lấy từ sheet khác (XUATTP)
- *IF( Dấu * ở đây có nghĩa là gì ?
Dấu * là dấu nhân thôi chứ có gì đâu ta?
- Range("Q" & Worksheets("KEHOACH").Cells(1, 1)) Câu lệnh này có phải chọn cột Q tại sheets kế hoạch không ạ
Đúng là thao tác với cột Q sheet kế hoạch. (chọn thì không có)
- Nếu e muốn tính tộng có điệu kiện các dòng của sheet2 đổ về các dòng tương ứng điều kiện của sheets1 thi e phải làm sao.
Thì hãy đưa file lên đây.
 
Upvote 0
Nhờ mọi người kiểm tra dùm em xem tại sao CODE này lại báo lỗi ạ. Trong File em muốn tính tổng của từng bộ phận
 

File đính kèm

Upvote 0
Nhờ mọi người kiểm tra dùm em xem tại sao CODE này lại báo lỗi ạ. Trong File em muốn tính tổng của từng bộ phận

Code của bạn:
Mã:
Sub vidu()
Dim i As Integer, j As Integer, tong As [COLOR=#ff0000]Integer[/COLOR]
...................
End Sub
Giới hạn của Integer chỉ đến 32,767 trong khi giá trị bạn cộng dồn lên đến hàng triệu. Vậy thay chỗ màu đỏ thành Long xem sao
Mà nói chung thì cũng chẳng việc gì phải xài Integer, cứ Long toàn bộ cho nó chắc
 
Upvote 0
Code của bạn:
Mã:
Sub vidu()
Dim i As Integer, j As Integer, tong As [COLOR=#ff0000]Integer[/COLOR]
...................
End Sub
Giới hạn của Integer chỉ đến 32,767 trong khi giá trị bạn cộng dồn lên đến hàng triệu. Vậy thay chỗ màu đỏ thành Long xem sao
Mà nói chung thì cũng chẳng việc gì phải xài Integer, cứ Long toàn bộ cho nó chắc

Dạ . Cảm ơn chú ạ :-=:-=
 
Upvote 0
1/"""" tương đương với để trống, khi bạn xài công thức trực tiếp ở ngoài sheet thì là "" (Tức là khi dữ liệu trong cell mà trống thì lấy 0)

Theo bạn hiểu liên kết có nghĩa là gì? Chỗ tô đỏ là điều kiện lấy từ sheet khác (XUATTP)

Dấu * là dấu nhân thôi chứ có gì đâu ta?

Đúng là thao tác với cột Q sheet kế hoạch. (chọn thì không có)

Thì hãy đưa file lên đây.

Hiện Tại file em đang làm mong a chị chỉ dẫn
 

File đính kèm

Upvote 0
Bài này dùng hàm, chứ vba chi vậy bạn.
TÔi làm công thức cho bạn tại cột L, các cột khác bạn tự nghiên cứu và làm theo

Mã:
 L4 =SUMIFS(XUATTP!$K$4:$K$1000,XUATTP!$G$4:$G$1000,$B4,XUATTP!$D$4:$D$1000,$E4,XUATTP!$E$4:$E$1000,$F4,XUATTP!$H$4:$H$1000,$G4,XUATTP!$F$4:$F$1000,$H4,XUATTP!$J$4:$J$1000,$I4)
Cớm Ơn Anh về đoạn mã cho em xin hỏi thêm chút xíu về vấn đề VBA
____SUM(IF(RC12=XUATTP!R4C4:R50000C4, 1,0)*IF(RC13=XUATTP!R4C5:R50000C5,1,0): Giá trị 1 và 0 ở đây có nghĩa là gì
Em xin cám ơn
 
Upvote 0
Cái này là công thức mảng, Sum và If thôi mà, 1,0 là trong hàm if trả về nếu True thì 1, false là 0. Hàm này chẳng qua là bạn gõ ngoài sheet thôi mà... Ví dụ If(1>0,true,false). Thì biểu thức trên ta có thể thay thế chữ true/false bằng 1/0 hoặc là "Đúng"/"Sai" thôi...
P/s: Bạn hỏi mấy vấn đề này thì nên cần đọc lại lý thuyết VBA căn bản, cũng như hàm cơ bản của excel...
Hiện tại em đang học :D Mới mua hai quấn sách của GPE nhà mình đang đọc và tìm hiểu thaks a chị nhiều :D}}}}}
 
Upvote 0
Hiện tại em đang học :D Mới mua hai quấn sách của GPE nhà mình đang đọc và tìm hiểu thaks a chị nhiều :D}}}}}

Muốn "đau khổ" với VBA thì xem Sub này, tôi viết chỉ cho 1 cột K (xuất TP - sheet KEHOACH).
Bạn tuỳ ý chỉnh sửa vị trí các điều kiện lọc... thành 2 cái Sub nữa cho Nhap_BB và Xuât_BB là sử dụng được cho file của bạn với dữ liệu lớn. (Nhìn vào có lẽ rất dễ chỉnh)
PHP:
Public Sub Xuat_TP()
Dim Dic As Object, sArr(), dArr(), Tem As String, I As Long, J As Long, Rws As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("KEHOACH")
    sArr = .Range(.[A4], .[A4].End(xlDown)).Resize(, 9).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
    K = K + 1
    Tem = sArr(I, 2)
    For J = 5 To 9
        Tem = Tem & "#" & sArr(I, J)
        If Not Dic.Exists(Tem) Then
            Dic.Add Tem, K
        End If
    Next J
Next I
With Sheets("XUATTP")
    sArr = .Range(.[A4], .[K4].End(xlDown)).Value
End With
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 7) & "#" & sArr(I, 4) & "#" & sArr(I, 5) & "#" & sArr(I, 8) & "#" & sArr(I, 6) & "#" & sArr(I, 10)
    If Dic.Exists(Tem) Then
        Rws = Dic.Item(Tem)
        dArr(Rws, 1) = dArr(Rws, 1) + sArr(I, 11)
    End If
Next I
Sheets("KEHOACH").Range("K4").Resize(K) = dArr
Set Dic = Nothing
End Sub
 
Upvote 0
Các bác cho em hỏi chú xíu về đoạn code sau :
Range("R" & Worksheets("Sheet1").Cells(1, 1)).Formula = "=IF((RC15=A),0,(RC16-RC17))"

Nếu như em muốn có thêm một giá trị để xét VD RC15 = A HOẶC RC15 = B để trả về đúng hoặc sai thì phải viết như thế nào ạ.
em cám ơn các bác nhiều
 
Upvote 0
Các bác cho em hỏi chú xíu về đoạn code sau :
Range("R" & Worksheets("Sheet1").Cells(1, 1)).Formula = "=IF((RC15=A),0,(RC16-RC17))"

Nếu như em muốn có thêm một giá trị để xét VD RC15 = A HOẶC RC15 = B để trả về đúng hoặc sai thì phải viết như thế nào ạ.
em cám ơn các bác nhiều
Chắc là vầy: =IF(OR(RC15=A,RC15=B),0,RC16-RC17)
Mà A, B của bạn gì vậy, để trơ như vậy cũng được hả ta.
 
Upvote 0
Chắc là vầy: =IF(OR(RC15=A,RC15=B),0,RC16-RC17)
Mà A, B của bạn gì vậy, để trơ như vậy cũng được hả ta.
em khai báo bên trên, a và b là chuỗi VD như a có thể là TN30
em mới thử nhưng nó báo lỗi #NAME bác ạ :((( có cách nào khác không ạ
Range("R" & Worksheets("Sheet1").Cells(1, 1)).Formula = "=IF((RC15=""TN30""),0,(RC16-RC17))"
Hiện tại câu lệnh của em là như trên và chỉ biết chọn một giá trị
 
Lần chỉnh sửa cuối:
Upvote 0
Các bác cho em hỏi chú xíu về đoạn code sau :
Range("R" & Worksheets("Sheet1").Cells(1, 1)).Formula = "=IF((RC15=A),0,(RC16-RC17))"

Nếu như em muốn có thêm một giá trị để xét VD RC15 = A HOẶC RC15 = B để trả về đúng hoặc sai thì phải viết như thế nào ạ.
em cám ơn các bác nhiều
Bạn không nên tìm cách viết hoặc sửa công thức như vậy. Cách đơn giản nhất là bạn cứ nhập công thức mà bạn muốn vào một ô nào đó, chọn ô đó và chuyển sang môi trường VBE gõ vào cửa sổ Immediate (nếu không có cửa sổ này thì nhấn Ctrl + G) dòng lệnh sau
PHP:
?ActiveCell.FormulaR1C1
 
Upvote 0
Sửa code định dạng biểu đồ ?

Xin chào tất cả các bạn,
Tôi muốn chạy code dưới đây để định dạng cho 18 biểu đồ (Chart1~ chart 18) trong 1 sheets
Xin hỏi có có cách viết nào cho code bên dưới để có thể định dạng toàn bộ 18 biểu đồ này theo nội dung bên dưới không ạ?
Mã:
Sub Macro1()
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.SeriesCollection(1).DataLabels.Select
    Selection.NumberFormat = "0.00%"
    ActiveChart.SeriesCollection(2).DataLabels.Select
    Selection.NumberFormat = "0.00%"
    ActiveChart.SeriesCollection(5).DataLabels.Select
    Selection.NumberFormat = "0.00%"
End Sub

Rất mong nhận được sự hỗ trợ của các bạn.
Trân trọng cảm ơn.
 
Upvote 0
Xin chào tất cả các bạn,
Tôi muốn chạy code dưới đây để định dạng cho 18 biểu đồ (Chart1~ chart 18) trong 1 sheets
Xin hỏi có có cách viết nào cho code bên dưới để có thể định dạng toàn bộ 18 biểu đồ này theo nội dung bên dưới không ạ?
Mã:
Sub Macro1()
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.SeriesCollection(1).DataLabels.Select
    Selection.NumberFormat = "0.00%"
    ActiveChart.SeriesCollection(2).DataLabels.Select
    Selection.NumberFormat = "0.00%"
    ActiveChart.SeriesCollection(5).DataLabels.Select
    Selection.NumberFormat = "0.00%"
End Sub

Rất mong nhận được sự hỗ trợ của các bạn.
Trân trọng cảm ơn.

Rất khó để giúp bạn khi mà không có file đính kèm để test, thôi thì bạn thử chạy đoạn này xem có giúp gì được cho bạn không nhé.
Mã:
Sub Macro1()
               Dim n As Byte
                With ActiveSheet
                    For n = 1 To 14
                        With .ChartObjects("Chart " & n).Activate
                            With ActiveChart
                                .SeriesCollection(1).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(2).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(5).DataLabels.NumberFormat = "0.00%"
                            End With
                        End With
                    Next n
                End With
End Sub
 
Upvote 0
Rất khó để giúp bạn khi mà không có file đính kèm để test, thôi thì bạn thử chạy đoạn này xem có giúp gì được cho bạn không nhé.
Mã:
Sub Macro1()
               Dim n As Byte
                With ActiveSheet
                    For n = 1 To 14
                        With .ChartObjects("Chart " & n).Activate
                            With ActiveChart
                                .SeriesCollection(1).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(2).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(5).DataLabels.NumberFormat = "0.00%"
                            End With
                        End With
                    Next n
                End With
End Sub

Cảm ơn bạn nhiều nhé,code trên chạy ra kết quả đúng ý tôi muốn rồi.
 
Upvote 0
Em có 1 thắc mắc nhỏ sau. Mong anh/chị giải thích.
ví dụ: một số anh chị viết vòng lặp For... Next...
For i = 1 to ubound(xxx)
...
Next
sau chữ next có người viết là
Next i
có người viet Next

Anh/chị có thể giải thích 2 cách này có j khác nhau không ạ?
 
Upvote 0
Em có 1 thắc mắc nhỏ sau. Mong anh/chị giải thích.
ví dụ: một số anh chị viết vòng lặp For... Next...
For i = 1 to ubound(xxx)
...
Next
sau chữ next có người viết là
Next i
có người viet Next

Anh/chị có thể giải thích 2 cách này có j khác nhau không ạ?
Vụ này mình để ý thấy đúng là thi thoảng cũng có người viết Next thay vì Next i nhưng VBA vẫn hiểu được và CODE thì vẫn chạy đúng. Tuy nhiên nếu CODE có nhiều hơn 1 vòng lặp For thì ta nên viết rõ là Next i , Next k,... hay Next biến gì đó. Viết vầy cho tường minh
 
Upvote 0
Em có 1 thắc mắc nhỏ sau. Mong anh/chị giải thích.
ví dụ: một số anh chị viết vòng lặp For... Next...
For i = 1 to ubound(xxx)
...
Next
Nhưng sau chữ next có người viết là
Next i

Theo mình, cách nào VBA cũng hiểu; nhưng với bản thân người viết & người xem người khác viết có khác nhau.

Cách sau nó 'tường minh' hơn.
Khẳng định là đến đó (từ đó trở về sau) thì tham biến i ta có thể xài vô việc khác nếu muốn​
Fân biệt được khối dòng lệnh của vòng lặp này với khối lệnh của vòng lặp khác (dễ nhìn hơn).

Tóm lại là dễ quản các dòng lệnh giành cho những người mới bắt đầu như mình.

Những mong ít nhiều giúp được bạn.
 
Upvote 0
Em chưa hiểu ý của anh lắm.

Đã đếm chưa? sau khi đếm rồi mà vẫn không hiểu thì hãy hỏi tiếp.

số người viết "Next" trên diễn đàn GPE đông hơn nhiều so với số người viết "Next i" . không biết em nên tự suy ra điều gì đây anh ?

Suy ra: có thể hỏi thẳng những người viết "next i"

Bởi vì tôi là một trong những người đó, cho nên trường hợp của tôi như sau:
Theo lý thuyết, đó chỉ là một thói quen cũ của những người quen với BASIC thời thượng cổ. Ngày xưa, chưa có màn hình động cho nên code phải viết từng dòng. "Next i" giúp trình dịch BASIC biết chỗ để nối với cái chỗ "For i="
Với màn hình động mấy chục năm nay, VBA không cần điểm này nữa. "Next i" chỉ mất công thôi.
Tuy nhiên, tôi vẫn giữ thói quen này là vì nó giúp cho dễ hơn khi cần cắt dán code - dễ nhận ra khi copy/cut-paste thiếu, trật chỗ. Nếu bạn không cut-paste nhiều thì hoàn toàn không cần.

Việc có hay không có thì dễ nhìn, tường minh này nọ chỉ là quan niệm thôi. Có nhiều cách để khác viết code dễ nhìn.
 
Upvote 0
Đã đếm chưa? sau khi đếm rồi mà vẫn không hiểu thì hãy hỏi tiếp.



Suy ra: có thể hỏi thẳng những người viết "next i"

Bởi vì tôi là một trong những người đó, cho nên trường hợp của tôi như sau:
Theo lý thuyết, đó chỉ là một thói quen cũ của những người quen với BASIC thời thượng cổ. Ngày xưa, chưa có màn hình động cho nên code phải viết từng dòng. "Next i" giúp trình dịch BASIC biết chỗ để nối với cái chỗ "For i="
Với màn hình động mấy chục năm nay, VBA không cần điểm này nữa. "Next i" chỉ mất công thôi.
Tuy nhiên, tôi vẫn giữ thói quen này là vì nó giúp cho dễ hơn khi cần cắt dán code - dễ nhận ra khi copy/cut-paste thiếu, trật chỗ. Nếu bạn không cut-paste nhiều thì hoàn toàn không cần.

Việc có hay không có thì dễ nhìn, tường minh này nọ chỉ là quan niệm thôi. Có nhiều cách để khác viết code dễ nhìn.

ồ , những người lớn tuổi cũng có nhiều câu chuyện hay quá nhỉ ? hi hi
với em thì cái thời chưa có màn hình động đó thì em chưa có mặt trên đời nữa .
 
Upvote 0
ồ , những người lớn tuổi cũng có nhiều câu chuyện hay quá nhỉ ? hi hi
với em thì cái thời chưa có màn hình động đó thì em chưa có mặt trên đời nữa .

Thỉnh thonagr bạn có thấy cái từ vbLF, vbCR. LF là Line Feed (10), CR là Carriage Return (13). Biết mấy từ đó ở đâu ra không?
 
Upvote 0
Thời bảo đại ở truồng, người ta gõ văn bản trên cái bàn đánh máy chữ.
Bàn này có 2 cơ phận chính: cơ phận điều khiển gõ lý tự và cơ phận điều khiển tờ giây.
Diễn tả rất dài dòng, nên chỉ đại khái là cơ phận điều khiển giấy có nhiệm vụ dời giấy như thế nào để ký tự có thể tiếp tục gõ mà không chôgf lên nhau. Sau khi hết dòng hoặc gặp lúc cần sang dòng mới thì cần 2 việc:
Thứ nhât, cuộn dòng cũ lên để có thể sang dòng mới.
Thứ hai, bắt đầu từ vị trí đầu tiên của dòng mới.
Cái cơ phận làm công việc này được gọi là cái carriage. Hành động cuộn lên dòng mới là line feed. Hành động kéo về vị trí đầu dòng là carriage return.

Qua thời đại điện tử thhif các từ này vẫn còn được dùng. Hiện nay, tuỳ theo hệ thóng vận hành mà bạn có thể định nghĩa dòng mới khác nhau:
1. Line feed, hoặc
2. Carriage Return, hoặc
3. LF + CR. Chính đám này cũng chia 2, nhóm đặt LF trước và nhóm đặt CR trước.

Khi làm việc cần tìm hiểu luật của hệ thống vận hành diễn tả dòng mới là ký hiệu nào.
 
Upvote 0
Ôi, không ngờ mọi người lại thảo luận vế đề này , hihi
Em rất thích những câu hỏi kiểu này đó ạ, những câu hỏi tưởng chừng dễ đến mức không ai muốn hỏi nhưng lại là vấn đề có thể nhiều người không để ý biết đến.
Ngay trước câu hỏi này em cũng có viết:
Rất khó để giúp bạn khi mà không có file đính kèm để test, thôi thì bạn thử chạy đoạn này xem có giúp gì được cho bạn không nhé.
Mã:
Sub Macro1()
               Dim n As Byte
                With ActiveSheet
                    For n = 1 To 14
                        With .ChartObjects("Chart " & n).Activate
                            With ActiveChart
                                .SeriesCollection(1).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(2).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(5).DataLabels.NumberFormat = "0.00%"
                            End With
                        End With
                    Next n
                End With
End Sub

Thật sự em cũng không biết về vấn đề viết next n và next có gì khác nhau hay không. Nhưng em thấy 2 cách viết này nó đều không có lỗi gì vẫn hoạt động bình thường nên cứ viết kiểu next n thôi ạ.
Viết như thế này sẽ giúp cho những người kém cói như em khi nhìn vào code có thể dễ nhìn thấy sự kết thúc của vòng lặp nào nếu trong đoạn code có từ 2 vong lặp trở lên... chỉ đơn giản như vậy thôi ạ.
 
Upvote 0
...
Viết như thế này sẽ giúp cho những người kém cói như em khi nhìn vào code có thể dễ nhìn thấy sự kết thúc của vòng lặp nào nếu trong đoạn code có từ 2 vong lặp trở lên... chỉ đơn giản như vậy thôi ạ.

Dễ và khó là từ ngữ có tính cách chủ quan. Như tôi đã đề cập, có nhiều cách để làm cho dễ nhìn. Cách hữu hiệu nhất là dùng dấu cách để đẩy code sâu vào. 2 hay 3, 4 vòng lặp đều được. Trong code của bạn có một đống with. Tại sao cần phân biệt được chỗ kết vòng lặp mà không phân biệt chỗ kết with?
 
Upvote 0
Dễ và khó là từ ngữ có tính cách chủ quan. Như tôi đã đề cập, có nhiều cách để làm cho dễ nhìn. Cách hữu hiệu nhất là dùng dấu cách để đẩy code sâu vào. 2 hay 3, 4 vòng lặp đều được. Trong code của bạn có một đống with. Tại sao cần phân biệt được chỗ kết vòng lặp mà không phân biệt chỗ kết with?

Ui, Thầy ơi!
Cái này em chưa thấy ai phân biệt khác ngoài việc dùng phím Tab Thầy ah.
Nói thật là em chỉ nói nên suy nghĩ của em đã làm thôi ạ,chứ Thầy mà hỏi thì chắc dù có dành thời gian còn lại của cuộc đời này để học code thì em cũng không thể trả lời được câu hỏi của Thầy đâu ạ.**~**

Cảm ơn Thầy đã quan tâm ạ!
 
Upvote 0
Trả lời:

bạn có 2 vòng lặp for, thay vì bạn lòng chúng vào nhau:
for i1 = 1 to 10
...
for i2 = 1 to 5
... ' code của i2
next i2
... ' code của i1
next i1

Sau một hồi cắt dán, bạn lỡ chúng thành móc vào nhau:
for i1 = 1 to 10
...
for i2 = 1 to 5
... ' code của i2
next i1
... ' code đáng lẽ của i1, bây giờ thành i2
next i2

VBA sẽ la toáng lên là vòng lặp của bạn lỗi. Đó là nhờ nó thấy rõ tình trạng "móc" thay vì "lồng"

Nhưng nếu code của bạn chỉ dùng next trơn thì VBA không cách nào biết là bạn bị lầm, và có khả năng bạn bị kết quả sai.

Đối với End With thì hơi khác. With là lệnh ghép tiền tố. 99% các trường hợp, nếu bạn đừng lạm dụng nó thì sẽ thấy nó ghép nghiêm chỉnh.

Riêng IF/THEN/ELSE/END IF thì hơi khó chịu. Rất dễ bị lầm. Vì vậy nếu bạn để ý khi tôi dùng những block IF lớn, nhiều dòng, tôi có chú (comment) ở ELSE và END IF.
 
Upvote 0
Đếm số liệu

Em muốn có thông báo đếm số liệu từ cell dưới cùng đến cell A9 có bao nhiêu số liệu
em dùng code
Mã:
Sub Dem()
    With Sheets("TH")
        If [A65536].End(xlUp).Row <= 8 Then
            [COLOR=#ff0000][B]MsgBox [A65536].End(xlUp).Rows.Count[/B][/COLOR]
            MsgBox "Sheet TH Không có du lieu!"
            Exit Sub
        End If
    End With
End Sub
Trong đó dòng màu đỏ không hiển thị Msgbox (đúng là hiển thị là 3)
Nhờ anh chị hướng dẫn, em cảm ơn
 

File đính kèm

Upvote 0
Em muốn có thông báo đếm số liệu từ cell dưới cùng đến cell A9 có bao nhiêu số liệu
em dùng code
Mã:
Sub Dem()
    With Sheets("TH")
        If [A65536].End(xlUp).Row <= 8 Then
            [COLOR=#ff0000][B]MsgBox [A65536].End(xlUp).Rows.Count[/B][/COLOR]
            MsgBox "Sheet TH Không có du lieu!"
            Exit Sub
        End If
    End With
End Sub
Trong đó dòng màu đỏ không hiển thị Msgbox (đúng là hiển thị là 3)
Nhờ anh chị hướng dẫn, em cảm ơn
Tôi hiểu ý bạn là như thế này phải không?
Mã:
Sub Dem()
Dim lr
lr = Range("A" & Rows.Count).End(3).Row
        If lr > 8 Then
            MsgBox lr - 8
          Else
            MsgBox "Sheet TH Không có du lieu!" 
            Exit Sub
        End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chắc bạn muốn vậy hả??
Mã:
Sub Dem()
With Sheets("TH")
    If [A65536].End(xlUp).Row <= 8 Then
        MsgBox "Sheet TH Không có du lieu!": Exit Sub
    Else
        MsgBox [A65536].End(xlUp).Row - 8
    End If
End With
End Sub
Dạ đúng theo ý muốn
Cho em hỏi thêm, nếu File trên của em, em tạo thêm 1 sheet mới và đứng tại sheet này ta chạy code Dem() thì kết quả thông báo là
" Sheet TH Không có du lieu!"
Em không hiểu tại sao nó ra thông báo như vậy ? vì cột A có dữ liệu mà
Em cảm ơn
 
Upvote 0
Dạ đúng theo ý muốn
Cho em hỏi thêm, nếu File trên của em, em tạo thêm 1 sheet mới và đứng tại sheet này ta chạy code Dem() thì kết quả thông báo là
" Sheet TH Không có du lieu!"
Em không hiểu tại sao nó ra thông báo như vậy ? vì cột A có dữ liệu mà
Em cảm ơn
Thử cái code #527 ấy. Xem có khác tí nào hông? Nếu không khác thì lại phải đưa file lên thôi.
 
Upvote 0
Đã thử rồi
Bây giờ tại Sheet1, ta chạy code thì thông báo " Sheet TH Không có du lieu!"
Mã:
Sub Dem()
With Sheets("TH")
    If[SIZE=6] [COLOR=#ff0000].[/COLOR][/SIZE][A65536].End(xlUp).Row <= 8 Then
        MsgBox "Sheet TH Không có du lieu!": Exit Sub
    Else
        MsgBox [SIZE=5][COLOR=#ff0000].[/COLOR][/SIZE][A65536].End(xlUp).Row - 8
    End If
End With
End Sub
Thêm 2 dấu chấm màu đỏ vô là được ngay.
 
Upvote 0
[NHỜ GIẢI THÍCH ĐOẠN BÔI ĐỎ TRONG CODE]

Em có tìm hiểu qua về RegExp tuy nhiên vẫn bị mắc chỗ này, nhờ mọi người giải thích giùm ạ
Mã:
Function TachHD(s As String)
With CreateObject("Vbscript.RegExp")
    .Global = True
    .Pattern = "\d{7}"
[COLOR=#ff0000][B]    TachHD = .Execute(s).Item(0)[/B][/COLOR]
End With
End Function

Em xin cảm ơn !
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Món này khó nút. Chịu khó đến link sau mà đọc nhé chàng trai: http://www.giaiphapexcel.com/forum/showthread.php?76017-VBscript-Regexp

P/s: tôi cũng chưa tìm hiểu & chưa biết về RegExp (khi nào có nhu cầu thì tìm hiểu sâu) giờ cứ tềnh tềnh thôi...
Đọc mấy bài đó đau đầu quá.........tềnh tềnh thôi...--=0
Thêm Link nữa nè
http://www.giaiphapexcel.com/forum/...hử-nghiệm-VBScript-RegExp&p=430042#post430042
 
Upvote 0
[NHỜ GIẢI THÍCH ĐOẠN BÔI ĐỎ TRONG CODE]

Em có tìm hiểu qua về RegExp tuy nhiên vẫn bị mắc chỗ này, nhờ mọi người giải thích giùm ạ
Mã:
Function TachHD(s As String)
With CreateObject("Vbscript.RegExp")
    .Global = True
    .Pattern = "\d{7}"
[COLOR=#ff0000][B]    TachHD = .Execute(s).Item(0)[/B][/COLOR]
End With
End Function

Em xin cảm ơn !

Đoạn đỏ đỏ:
Hàm Execute của RegExp trả về một collection các đoạn chuỗi mà nó tìm được.
Thuộc tính Item của collection truy vấn phần tử. (0) là chỉ số của phần tử đầu tiên.

Chú thích:
Theo cách viết thì chỉ dùng được cho hàm người dùng. Đặt vào code khác để gọi hơi nguy hiểm, bởi vì nếu không có chuỗi con match nào thì Execute sẽ trống, truy vấn phần tử của nó sẽ bị lỗi.
 
Upvote 0
chào mọi người.
em có 1 đoạn code thế này
Mã:
Private Sub UserForm_Initialize()
'thuc hien truoc khi show form
    Dim WDow As Window
'thêm các workbook đang mở
    If Windows.Count <> 0 Then
        ReDim ArrListBox1(Windows.Count - 1)
        For Each WDow In Windows
            ArrListBox1(i) = WDow.Caption
            i = i + 1
        Next
'xóa listWook cũ
        ListWBook.Clear
        ListWBook.List = ArrListBox1
    Else
        Unload Me
        MsgBox "Không có Trang Tính nào ca?"
        On Error GoTo 0
    End If
End Sub

'-----------------------------------------
'Thực hiện khi đã show form
Private Sub UserForm_Activate()
'chon muc dau tien cua ListWBook
    Me.ListWBook.ListIndex = 0
'kich hoat checkbox XemTatCa
[COLOR=#ff0000]    Me.XemTatCa.Value = True[/COLOR]
End Sub

'-----------------------------------------
Private Sub XemTatca_Click()
    Set WinWb = Windows([COLOR=#0000ff]ListWBook.Value[/COLOR])
    Set WBook = WinWb.Parent
    ...code....
    On Error Resume Next
    Me.ListWSheet.ListIndex = 0
End Sub
đến khi kích hoạt XemTatCa thì bị lỗi ListWBook.Value=""
lúc thì chạy được, lúc thì không chạy được. em chả hiểu bị lỗi gì
mong được mọi người giúp
http://www.giaiphapexcel.com/forum/showthread.php?111414-Nhờ-sửa-lỗi-tham-chiếu-trong-Listbox
 
Upvote 0
Giả sử Em có các cột (Mặt hàng, Số lương, Đơn giá, Thành tiền) và em đang sử dụng filter 2 cột (Mặt hàng và Số lượng). Dữ liệu mà nhiều nắm lúc ko biết là đang filter ở cột nào.
A/Chị có cách nào dùng code để chạy một phát là các cột đều ở dạng sellect all (tức là sẽ ko còn cột nào đang ở chế độ filter). Mong A/Chị giúp đỡ. Cám ơn A/C!
 
Upvote 0
Giả sử Em có các cột (Mặt hàng, Số lương, Đơn giá, Thành tiền) và em đang sử dụng filter 2 cột (Mặt hàng và Số lượng). Dữ liệu mà nhiều nắm lúc ko biết là đang filter ở cột nào.
A/Chị có cách nào dùng code để chạy một phát là các cột đều ở dạng sellect all (tức là sẽ ko còn cột nào đang ở chế độ filter). Mong A/Chị giúp đỡ. Cám ơn A/C!
Thử đơn giản như vầy:
Mã:
Sub GPE()
ActiveSheet.AutoFilterMode = False
End Sub
 
Upvote 0
Giả sử Em có các cột (Mặt hàng, Số lương, Đơn giá, Thành tiền) và em đang sử dụng filter 2 cột (Mặt hàng và Số lượng). Dữ liệu mà nhiều nắm lúc ko biết là đang filter ở cột nào.
A/Chị có cách nào dùng code để chạy một phát là các cột đều ở dạng sellect all (tức là sẽ ko còn cột nào đang ở chế độ filter). Mong A/Chị giúp đỡ. Cám ơn A/C!
Excel có sẵn cái nút này mà, cần gì viết code nữa.
Data | Sort & Filter | Clear
 
Upvote 0
Hiện tại Em đang sử dụng conditional formating với công thức.
=IF($F10<>"";TRUE;FALSE)
Để khi nhập dữ liệu ngày vào cột F thì nó tự định dạng border cho dòng (nếu cột F có dữ liệu thì sẽ định dạng dòng cho dòng đó).
Nhưng nếu dữ liệu nhiều thì nó sẽ bị chậm dữ liệu.
A/C giúp Em code để nó sẽ tô mầu cho dòng theo điều kiện nếu dòng F có dữ liệu thì nó sẽ tự động định dạng border theo sự kiện worksheetchange. Mong A/C giúp. Cám ơn A/C!
 

File đính kèm

Upvote 0

File đính kèm

Upvote 0
Bạn ơi mình tải file của bạn giúp mình về. Mình xóa cái conditional formating với công thức =IF($F10<>"";TRUE;FALSE)
Thì nó ko tự kẻ dòng được. Bạn xem lại giúp mình với nhé. Cám ơn Bạn!

Sorry bạn,lúc nãy Test thử quên không xóa cái CF đi, bây giờ sửa lại rồi đó, gửi lại bạn File này
 

File đính kèm

Upvote 0

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

Back
Top Bottom