đánh số thứ tự bằng vba (1 người xem)

Liên hệ QC

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

minhhangg

Thành viên hoạt động
Tham gia
4/5/11
Bài viết
197
Được thích
61
Hỏi những gì trong file. Thank you trước.
Theo thứ tự tăng dần, có dữ liệu thì có STT, không có dữ liệu thì bỏ trống.
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn ơi, cho hỏi có phải đánh số thứ tự từ A7? Và số từ A7 là 1 và số cuối cùng sẽ nhận giá trị từ C7 phải không?

Ví dụ: C7 là 450 thì đánh số từ A7 là từ 1 đến 450 phải vậy không?
 
Upvote 0
Bạn ơi, cho hỏi có phải đánh số thứ tự từ A7? Và số từ A7 là 1 và số cuối cùng sẽ nhận giá trị từ C7 phải không?

Ví dụ: C7 là 450 thì đánh số từ A7 là từ 1 đến 450 phải vậy không?
VD: C7 có dữ liệu thì là 1
C8 có dữ liệu thì là 2
C10 có dữ liệu thì là 3
Có dữ liệu là có STT mà tăng dần bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
VD: C7 có dữ liệu thì là 1
C8 có dữ liệu thì là 2
C10 có dữ liệu thì là 3
Có dữ liệu là có STT mà tăng dần bạn.
Có đưa file lên thi ít ra cũng có tí dữ liệu để người ta còn mường tượng ---> 1 cái file trống không, ai biết gì đâu mà làm
(mặc dù tôi cũng hơi hiểu ý nhưng gặp dạng file đính kèm kiểu này thì cảm thấy rất bực mình)
 
Upvote 0
có đưa file lên thi ít ra cũng có tí dữ liệu để người ta còn mường tượng ---> 1 cái file trống không, ai biết gì đâu mà làm
(mặc dù tôi cũng hơi hiểu ý nhưng gặp dạng file đính kèm kiểu này thì cảm thấy rất bực mình)
sorry,sorry,sorry,sorry,sorry,sorry,sorry,sorry,sorry,sorry,sorry. File đây
 

File đính kèm

Upvote 0
VD: C7 có dữ liệu thì là 1
C8 có dữ liệu thì là 2
C10 có dữ liệu thì là 3
Có dữ liệu là có STT mà tăng dần bạn.

Tôi chẳng hiểu gì cả! Vậy A1:A5000 để làm gì vậy? Tại sao C7 là 1 mà C10 là 3, lẽ ra là 4 chứ nhỉ?
 
Upvote 0
Chính xác công thức thì OK, nhưng em muốn code anh NDU ơi!. Cảm ơn
Thì vầy đi:
PHP:
Sub STT()
  Dim SrcRng As Range, Arr, i As Long, n As Long
  On Error Resume Next
  Set SrcRng = Range([C7], [C65536].End(xlUp))
  Arr = SrcRng.Value
  For i = 1 To UBound(Arr, 1)
    If Arr(i, 1) <> "" Then
      n = n + 1
      Arr(i, 1) = n
    End If
  Next
  SrcRng.Offset(, -2).Value = Arr
End Sub
 
Upvote 0
sorry,sorry,sorry,sorry,sorry,sorry,sorry,sorry,sorry,sorry,sorry. File đây

Bạn thử code này xem:

PHP:
Sub FillSeries()  
Application.ScreenUpdating = False  
Dim Rng As Range, Cls As Range  
Set Rng = Range(Sheet1.[C7], Sheet1.[C5000].End(xlUp))  
Rng.Offset(, -2).ClearContents  
For Each Cls In Rng
    If Cls <> "" Then      Cls.Offset(, -2) = WorksheetFunction.Max(Rng.Offset(, -2)) + 1  
Next  
Application.ScreenUpdating = True
End Sub




Sub FillSeries()
Application.ScreenUpdating = False
Dim Rng As Range, Cls As Range
Set Rng = Range(Sheet1.[C7], Sheet1.[C5000].End(xlUp))
Rng.Offset(, -2).ClearContents
For Each Cls In Rng
If Cls <> "" Then Cls.Offset(, -2) = WorksheetFunction.Max(Rng.Offset(, -2)) + 1
Next
Application.ScreenUpdating = True
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Xin nhắc bạn: Nếu cần đoạn code để đánh số thứ tự thì bài của bạn để đây là sai BOX!

ThungRac.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Đúng là nhìn vào code thì ngắn hơn,
Nói về NGẮN thì cái này mới là NGẮN đây:
PHP:
Sub STT()
  With Range([C7], [C65536].End(xlUp)).Offset(, -2)
    .Value = "=IF(RC[2]="""","""",COUNTA(R7C3:RC3))"
    .Value = .Value
  End With
End Sub
Ẹc... Ẹc...
Tuy nhiên, ĐƠN GIẢN không tương đương với TỐC ĐỘ (mảng là vô địch)
 
Upvote 0
Nói về NGẮN thì cái này mới là NGẮN đây:
PHP:
Sub STT()
  With Range([C7], [C65536].End(xlUp)).Offset(, -2)
    .Value = "=IF(RC[2]="""","""",COUNTA(R7C3:RC3))"
    .Value = .Value
  End With
End Sub
Ẹc... Ẹc...
Tuy nhiên, ĐƠN GIẢN không tương đương với TỐC ĐỘ (mảng là vô địch)
Bác Ơi, vậy muốn đánh số thứ tự theo ngày thì thế nào bác. Thêm 1 cột ngày nữa, và STT đánh theo ngày đó, hết ngày trước thì end và sang ngày mới thì đánh lại từ đầu.
 
Upvote 0
Em biết là sai box như bác SA_DQ cảnh báo tại #15. Tuy nhiên nội dung Topic này đang gần giống cái em cần nên em xin phép chen ngang hỏi 1 câu

Nói về NGẮN thì cái này mới là NGẮN đây:
PHP:
Sub STT()
  With Range([C7], [C65536].End(xlUp)).Offset(, -2)
    .Value = "=IF(RC[2]="""","""",COUNTA(R7C3:RC3))"
    .Value = .Value
  End With
End Sub
Ẹc... Ẹc...
Tuy nhiên, ĐƠN GIẢN không tương đương với TỐC ĐỘ (mảng là vô địch)

Em cần đánh mã vụ việc (như đánh số thứ tự) bằng VBA. Tuy nhiên do mã vụ việc gồm cả phần chữ và số nên em chưa biết cách làm. Mong các bác giúp đỡ.
Yêu cầu như sau:
- Dùng VBA để tạo mã vụ việc.
- Ngay khi nhập vụ việc, mã cần hiện ngay.
- Mã vụ việc gồm chữ và số
- Phần chữ thì cố định, phần số thì tăng dần đều (Phần chữ là mã của đơn vị lập vụ việc)
- Mã vụ việc không dựa và vào Stt được do yêu cầu mã luôn cố định, trong khi Stt khi sẽ thay đổi khi AutoFilter

Xin xem thêm file đính kèm

Chân thành cảm ơn!
 

File đính kèm

Upvote 0
Thì Bạn sửa lại code trên của ndu theo dữ liệu của bạn.

Mã:
Sub STT()
  With Range([b5], [b65536].End(xlUp)).Offset(, 1)
    .Value = "=IF(RC2="""","""",""CC_"" & COUNTA(R5C2:RC2))"
  End With
End Sub
 
Upvote 0
Thì vầy đi:
PHP:
Sub STT()
  Dim SrcRng As Range, Arr, i As Long, n As Long
  On Error Resume Next
  Set SrcRng = Range([C7], [C65536].End(xlUp))
  Arr = SrcRng.Value
  For i = 1 To UBound(Arr, 1)
    If Arr(i, 1) <> "" Then
      n = n + 1
      Arr(i, 1) = n
    End If
  Next
  SrcRng.Offset(, -2).Value = Arr
End Sub

Quá nhanh luôn, mình có 7000 dòng, minh tự viết
for i =1 to dongcuoi
sau đó gán
cell cần đánh số =i
thì nó chay khoảng 2- phút gì đó
Mình dùng cách này thì nó ngốn hết chưa đầy 1s
Ai giỏi mà dùng mảng trong báo cáo nhâp xuất tồn thì tuyệt vời
 
Upvote 0
Có ai giúp mình về Arr với hoặc có cách nào tốt hơn
Mình tự viết nó lủng củng và chạy như rùa

Cụ thể: Có 2 sheet, DanhMucHangHoa và TìnhTồn
DanhMucHangHoa gồm Mahang, TenHang, ThươngHieu, DonGia....
Mục đích: Chuyển dữ liệu theo ThuongHieu (Hãng) sang sheet TinhTon
Khó khăn: Các cột ở 2 sheet không ở vị trí tương đương
bên DanhMucHangHoa STT, MaHang, TenHang, GiaNhap,ThongTinh, ThuongHieu,GiaLe....
Khi dua qua MaHang, TenHang, GiaNhap, GiaXuat, TonDau, NhapTrongKy, XuatTrongKy,TonCuoi, ThuongHieu....
Cách của mình đang dùng (chậm):
sort dữ liêu theo ThuongHieu, đê chúng nằm cùng nhau sau đó
Tạo 2 function xác định dòng đầu và dòng cuối của 1 giá trị cần lọc theo ThuongHieu
Cuối cùng dùng dạng sau:(HH là DanhMuchanghoa)
sodong=DongCuoi(eR)-DongDau(bR)
With NXT
.Range("A11", "B" & soDong + 11) = HH.Range("B" & bR, "C" & eR).Value 'MA HANG & TEN HANG
.Range("C11", "D" & soDong + 11) = HH.Range("H" & bR, "I" & eR).Value 'Don Gia te
.Range("F11", "F" & soDong + 11) = HH.Range("J" & bR, "J" & eR).Value 'gia le
.Range("K11", "K" & soDong + 11) = HH.Range("E" & bR, "E" & eR).Value 'thuong hieu
.Range("G11", "G" & soDong + 11) = HH.Range("K" & bR, "K" & eR).Value 'ton
 
Upvote 0
Đã viết được Code thì tất nhiên bạn có file để chạy Code đó rồi; Vậy sao bạn không chuyển file lên diễn đàn mà đưa Code lên làm chi cho mệt vậy?
 
Upvote 0
Thì vầy đi:
PHP:
Sub STT()
  Dim SrcRng As Range, Arr, i As Long, n As Long
  On Error Resume Next
  Set SrcRng = Range([C7], [C65536].End(xlUp))
  Arr = SrcRng.Value
  For i = 1 To UBound(Arr, 1)
    If Arr(i, 1) <> "" Then
      n = n + 1
      Arr(i, 1) = n
    End If
  Next
  SrcRng.Offset(, -2).Value = Arr
End Sub
Biết là lâu lắm nhưng thầy giúp em với, Với code này khi sheet không có dữ liệu thì tiêu đề STT nó tự đổi thành số 1
 

File đính kèm

Upvote 0
sheet không có dữ liệu thì tiêu đề STT nó tự đổi thành số 1
Bỏ Private Sub Worksheet_SelectionChange
PHP:
Sub STT()
    Dim SrcRng As Range, Arr, i As Long, n As Long, Res()
    Dim lRow As Long
    With Sheet2
        lRow = .Range("G" & Rows.Count).End(xlUp).Row
        If lRow < 11 Then Exit Sub
        Set SrcRng = .Range("G11:H" & lRow)
        Arr = SrcRng.Value
        ReDim Res(1 To UBound(Arr, 1), 1 To 1)
        For i = 1 To UBound(Arr, 1)
             If Arr(i, 1) <> "" Then
               n = n + 1
               Res(i, 1) = n
             End If
        Next
        SrcRng.Offset(, -2).Value = Res
    End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
vẫn chưa làm được và đợi gpe giúp em :(
 
Upvote 0
Các cao nhân cho em xin code dò tìm dữ liệu với.
 
Upvote 0
Thì vầy đi:
PHP:
Sub STT()
  Dim SrcRng As Range, Arr, i As Long, n As Long
  On Error Resume Next
  Set SrcRng = Range([C7], [C65536].End(xlUp))
  Arr = SrcRng.Value
  For i = 1 To UBound(Arr, 1)
    If Arr(i, 1) <> "" Then
      n = n + 1
      Arr(i, 1) = n
    End If
  Next
  SrcRng.Offset(, -2).Value = Arr
End Sub

chào thầy, nhờ thầy xem lại code nếu chỉ có 1 dòng [C7] thì số thứ tự ko đúng (không phải là 1)
nhờ thầy chỉ giúp trường hợp như trên ạ
 
Upvote 0
Mọi người cho e hỏi đây chỉ là 1 sheet. Nhưng e muốn làm cho tất cả các sheet trong 1 file hoặc cả 1 thư mục gồm nhều file excel thì e làm như thế nào ạ. E cám ơn ạ
 
Upvote 0
Xin phép thầy, bài này lâu nhưng lại đúng ý muốn làm nhưng phát triển thêm theo kiểu này không biết có được không ạ !
" Bây giờ 1 muốn đánh dấu X vào các loại hình thức hồ sơ thì chỗ "số biên nhận" sẽ tự động đánh số thứ tự tiếp theo của hình thức đó.. Thì phải làm như thế nào ạ."
hoi.jpg
 

File đính kèm

Upvote 0
Thì vầy đi:
PHP:
Sub STT()
  Dim SrcRng As Range, Arr, i As Long, n As Long
  On Error Resume Next
  Set SrcRng = Range([C7], [C65536].End(xlUp))
  Arr = SrcRng.Value
  For i = 1 To UBound(Arr, 1)
    If Arr(i, 1) <> "" Then
      n = n + 1
      Arr(i, 1) = n
    End If
  Next
  SrcRng.Offset(, -2).Value = Arr
End Sub

Xin chào ndu96081631,
Phiền bạn chỉ giúp, dòng lệnh: On Error Resume Next
trong code trên để bắt lỗi gì vậy?
 
Upvote 0
Upvote 0
Để ý trong các code tôi đưa lên diễn đàn thường có dòng lệnh này. Dù đã bẫy lỗi rất kỹ nhưng vẫn cứ thêm dòng ấy vào cho chắc. Thói quen thôi bạn à
Cảm ơn ndu96081631 đã thông tin.
Phiền bạn giải thích thêm giúp OT, trong code bạn có:
Set SrcRng = Range([C7], [C65536].End(xlUp))
Arr = SrcRng.Value
và cũng có trường hợp viết:
i = .Range("C" & .Rows.Count).End(xlUp).Row
Arr = .Range("C7:C" & i).Value

Vậy trong trường hợp nào thì phải sử dụng set, trường hợp nào thì không sử dụng?
Khi sử dụng Set SrcRng thì kết thúc có phải Set SrcRng = nothing không?
 
Upvote 0
Cảm ơn ndu96081631 đã thông tin.
Phiền bạn giải thích thêm giúp OT, trong code bạn có:
Set SrcRng = Range([C7], [C65536].End(xlUp))
Arr = SrcRng.Value
và cũng có trường hợp viết:
i = .Range("C" & .Rows.Count).End(xlUp).Row
Arr = .Range("C7:C" & i).Value

Vậy trong trường hợp nào thì phải sử dụng set, trường hợp nào thì không sử dụng?
Khi sử dụng Set SrcRng thì kết thúc có phải Set SrcRng = nothing không?
Cứ cái nào là biến đối tượng (như Range, Object, Shape...) thì phải khởi tạo bằng động tác Set. Không phải đối tượng thì khỏi cần Set
Theo đó thì: do Dim SrcRng As Range ở trên ---> suy ra SrcRng là biến đối tượng, vậy phải Set
Arr là biến Variant, không phải đối tượng nên không cần Set, chỉ gán là được
 
Upvote 0
:oops:
Xin phép thầy, bài này lâu nhưng lại đúng ý muốn làm nhưng phát triển thêm theo kiểu này không biết có được không ạ !
" Bây giờ 1 muốn đánh dấu X vào các loại hình thức hồ sơ thì chỗ "số biên nhận" sẽ tự động đánh số thứ tự tiếp theo của hình thức đó.. Thì phải làm như thế nào ạ."
View attachment 204523
:oops:
 
Upvote 0
(2) Phiền bạn chỉ giúp, dòng lệnh: On Error Resume Next trong code trên để bắt lỗi gì vậy?
(1) Khi sử dụng Set SrcRng thì kết thúc có phải Set SrcRng = nothing không?
(1) Rất nên & đó là thói quen rất chi là tốt!
(2) Một khi ta biết chắc rằng chương trình gặp lỗi có thể bỏ qua để đi tiếp & không ảnh hưởng gì đến hòa bình thế giới, thì mới nên xài câu lệnh này.
Nhưng tốt hơn hết là là nên có fần bẫy lỗi cuối chương trình theo kiểu
PHP:
Sub GPE()
On Error Goto LoiCT
' . . . . . Các câu lệnh'
Err_ : Exit Sub
LoiCT:
If Err=424 then
   Goto Err_
Else
    MsgBox Err , , Error()
    On Error Resume Next
End If
End Sub
 
Upvote 0
Giải thích về Set:
Trong lập trình, phép tính căn bản nhất phép gán.
Theo tiêu chuẩn cổ xưa của BASIC thì dấu = là phép so sánh. Muốn gán thì phải là lênh Let và dấu bằng:
Let (biến cần gán) = (trị biểu thức)
Về sau này, máy tính mạnh hơn, trình dịch được cải tiến nên Let được bỏ đi.
VBA tuy không phải là loại ngôn ngữ hướng đối tượng nhưng nó có thể làm việc được với đối tượng. Căn bản là hầu hết các giao diện giữa VBA và Excel đều qua các đối tượng của Excel Application, Workbook, và Worksheet.
Tuy nhiên, các đối tượng hầu như luôn luôn có hàm mặc định để lấy giá trị, tức là lấy một thuộc tính nào đó của nó.
VBA quy định rằng lệnh gán bình thường (dấu =) sẽ là phép gọi hàm mặc định để lấy thuộc tính. Và để gán cả đối tượng thì dùng phép gán Set
Điển hình:
a = Range("a1") gọi hàm mặc định của range để lấy trị trong ô a1, gán cho biến a. Như vậy, sau lệnh này, a sẽ có trị bằng trị chứa trong a1
Set a = Range("a1") gán đối tượng Range("a1") cho a. Như vậy, sau lệnh này, a sẽ trỏ vào a1

Lưu ý rằng thực ra phép gán Set là gán tham chiếu/reference, gán địa chỉ. Trỏ biến vào địa chỉ của đối tượng

Vì vậy, nếu code Set đối tượng thì thường khi dùng xong, code sẽ Set nó về Nothing (tức là trỏ nó vào khoảng trống) để tránh tình trạng nó vẫn còn trỏ vào đối tượng ấy.
Tuy nhiên, nếu biến này là biến nội (được khai báo bên trong) của một Sub hay Function thì khi thoát Sub/Function nó sẽ tự giải thoát. Và do điều này, nhiều ngừoi cho rằng lệnh Set Nothing là thừa.
Tôi đã từng có bài so sánh thiệt hơn của hai quan niệm này. Việc bạn theo quan niệm nào là quyền của bạn. Tôi chỉ khuyên rằng đối với những người có thói quen dùng biến toàn cục thì lệnh Set khá nguy hiểm, lúc dùng phải cẩn thận theo dõi phạm vi của nó.

Giải thích về On Error Resume Next:
Trong lập trình, bẫy lỗi là điều quan trọng để bắt những sự kiện ngoài ý muốn.
Cụm từ "bẫy lỗi" là dịch tiếng nghề "error trap". Đó là từ xưa của lập trình. Ngày nay, các ngôn ngữ lập trình gọi nó là "exception handling" - "xử lý sự kiện ngoại lệ"
Khi chương trình bị một lỗi nào đó, ví dụ chia 0, thì tự nó sẽ không biết xử lý như thế nào, và sẽ "chết" (crash). Thực ra, bên trong hệ thống có phần xử lý an toàn, và có cả một quy trình xét ngăn xếp để biết chuyện gì xảy ra. Lệnh On Error dặn VBA đặt điều kiện trước để xử lý khi gặp lỗi. Lệnh Resume có nghĩa là bỏ qua lỗi đi và tiếp tục ở cái chỗ sau từ khoá Resume.
Như vậy On Error Resume Next có nghĩa là nếu gặp lỗi thì kệ nó đi và tiếp tục ở dòng kế tiếp.

Ở diễn đàn này, nhiều ngừoi thích sử dụng On Error Resume Next để trơn tru công việc. Thực ra, trước khi sử dụng nó, ngừoi lập trình phải cân nhắc các điểm sau:
- các lệnh xét lôgic (IF). Next của lệnh này là chỗ nào?
- các lệnh kép (ngăn bởi dấu ":"). Next của chúng lắm khi đưa vào chỗ sai.
- các lệnh gọi sub/function. Như trên, phải nắm vững là sub/function lúc đó đã chạy chưa. Nhất là các sub/function làm việc với biến/đối tượng toàn cục.
- các nơi vòng lặp duyệt. Bỏ qua như vậy là bỏ qua con tính hay bỏ qua một biến vòng lặp? Ví dụ, code lấy dữ liệu từ các files trong một folder. Lúc găp lỗi thì bỏ qua file đó. Như vậy, cuối cùng làm sao biết file nào được xử lý và file nào bị bỏ qua?

Tóm lại, lệnh On Error Resume Next là lệnh nguy hiểm. Toi khong hề nói là không nên dùng. Tôi chỉ nhấn mạnh là nếu dùng thì phải nắm vững cách xử lý các trường hợp tôi nêu trên.

Chú: lệnh On Error GoTo... ít nguy hiểm hơn, nhưng nên lưu ý rằng GoTo là lệnh rẽ nhánh không có kiểm soát. Nếu không cẩn thận thì sẽ dẫn đến tình trạng code rối chỉ (tiếng chính là spaghetti/mì Ý)
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào ndu96081631,SA_DQ,VetMini.

Oanh Thơ (OT) xin cảm ơn những giải thích rất chi tiết của các bạn.
Mặc dù OT tham ra GPE từ lâu nhưng tham gia chỉ hỏi thôi (không học) :(
Thời gian tới OT sẽ cố gắng không chỉ hỏi mà sẽ dành thời gian để tìm hiểu về Excel giao lưu với các bạn trên GPE,hi vọng sẽ nhận được những sự hỗ trợ nhiệt tình của các bạn trên GPE.

Cảm ơn các bạn , cảm ơn diễn đàn.
 
Upvote 0
Nếu trong userform thì làm thế nào vậy các a/c?
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn cần làm gì trong cái UserForm thân thương của bạn?
& đầu câu sao không viết hoa?
Mình thiết kế userform có sẵn textbox để nhập số thứ tự, giờ mình muốn để texbox đó tự động điền số thứ tự vào vì mình ẩn workbook chỉ để hiện form nhập liệu nên không biết được dữ liệu mình nhập vào ở thứ tự bao nhiêu. Mong được các a/c trên forum hướng dẫn. Xin chân thành cảm ơn!
 
Upvote 0
Bạn không nhìn thấy số thứ tự trước đó bạn đã nhập, nhưng máy sẽ nhìn thấy
Thì bảo máy nó cọng thêm 1 vô số TT có sẵn gần nhất phía trên nó
Ví dụ:

Cells(lRw,"A").Value= Cells(lRw-1,"A").Value + 1

Còn STT phát sinh lại theo ngày thì là chuyện khác thêm nữa.
 
Upvote 0
Nói về NGẮN thì cái này mới là NGẮN đây:
PHP:
Sub STT()
  With Range([C7], [C65536].End(xlUp)).Offset(, -2)
    .Value = "=IF(RC[2]="""","""",COUNTA(R7C3:RC3))"
    .Value = .Value
  End With
End Sub
Ẹc... Ẹc...
Tuy nhiên, ĐƠN GIẢN không tương đương với TỐC ĐỘ (mảng là vô địch)
bác cho em hỏi vậy nếu muốn đánh số thứ tự ở cột G từ ô G2 đổ xuống cho những ô có đánh dấu ở cột H thì như nào ạ
em cảmơn
 
Upvote 0
bác cho em hỏi vậy nếu muốn đánh số thứ tự ở cột G từ ô G2 đổ xuống cho những ô có đánh dấu ở cột H thì như nào ạ
Thứ nhất: Bạn phải tìm ra dòng cuối của cột 'G' (cột cần đánh số TT)
Thiết lập vòng lặp duyệt từ [G2] cho đến ô 'G' thuộc dòng cuối vừa tìm
Trong khi duyệt thì nếu gặp những ô bên phải có đánh dấu thì thêm 1 vô biến đềm STT

Chúc bạn sớm thành công trong hôm nay!
 
Upvote 0
Em gặp vấn đề là:
Cột B (Sản phẩm) có 60.000 dòng. Cột A đánh số thứ tự nếu sản phẩm là "B"
Vì số lượng dòng quá lớn nên dùm hàm IF+Max sẽ làm file chạy rất chậm, nên viết VBA có nhanh hơn không ạ, nhờ các anh/ chị chỉ giúp code VBA
 

File đính kèm

Upvote 0
Em gặp vấn đề là:
Cột B (Sản phẩm) có 60.000 dòng. Cột A đánh số thứ tự nếu sản phẩm là "B"
Vì số lượng dòng quá lớn nên dùm hàm IF+Max sẽ làm file chạy rất chậm, nên viết VBA có nhanh hơn không ạ, nhờ các anh/ chị chỉ giúp code VBA
Các sản phẩm khác có đếm hay không?
 
Upvote 0
Các sản phẩm khác có đếm hay không?

Không anh, em cần hỗ trợ đếm theo 1 điều kiện có sẵn!
 
Upvote 0
Các sản phẩm khác có đếm hay không?

Không anh, em cần hỗ trợ đếm theo 1 điều kiện có sẵn!
Bạn thử code dưới đây
Mã:
Sub Stt()
Dim Nguon, Kq
Dim DieuKien
Dim i, j, k
With Sheet1
    Nguon = .Range("B2", .Range("B1000000").End(xlUp))
    DieuKien = "B"
    k = UBound(Nguon)
    ReDim Kq(1 To k, 1 To 1)
    For i = 1 To k
        If Nguon(i, 1) = DieuKien Then
            j = j + 1
            Kq(i, 1) = j
        End If
    Next i
    .Range("A2").Resize(k, 1).ClearContents
    .Range("A2").Resize(k, 1) = Kq
End With
End Sub
 
Upvote 0
Em gặp vấn đề là:
Cột B (Sản phẩm) có 60.000 dòng. Cột A đánh số thứ tự nếu sản phẩm là "B"
Vì số lượng dòng quá lớn nên dùm hàm IF+Max sẽ làm file chạy rất chậm, nên viết VBA có nhanh hơn không ạ, nhờ các anh/ chị chỉ giúp code VBA
Tại A2 thử sử dụng công thức sau xem có khá hơn không:

A2 =IF($B2:$B2<>"B","",COUNTIF($A$1:$A1,">0")+1)
 
Upvote 0
Bạn thử code dưới đây
Mã:
Sub Stt()
Dim Nguon, Kq
Dim DieuKien
Dim i, j, k
With Sheet1
    Nguon = .Range("B2", .Range("B1000000").End(xlUp))
    DieuKien = "B"
    k = UBound(Nguon)
    ReDim Kq(1 To k, 1 To 1)
    For i = 1 To k
        If Nguon(i, 1) = DieuKien Then
            j = j + 1
            Kq(i, 1) = j
        End If
    Next i
    .Range("A2").Resize(k, 1).ClearContents
    .Range("A2").Resize(k, 1) = Kq
End With
End Sub
Bạn thử code dưới đây
Mã:
Sub Stt()
Dim Nguon, Kq
Dim DieuKien
Dim i, j, k
With Sheet1
    Nguon = .Range("B2", .Range("B1000000").End(xlUp))
    DieuKien = "B"
    k = UBound(Nguon)
    ReDim Kq(1 To k, 1 To 1)
    For i = 1 To k
        If Nguon(i, 1) = DieuKien Then
            j = j + 1
            Kq(i, 1) = j
        End If
    Next i
    .Range("A2").Resize(k, 1).ClearContents
    .Range("A2").Resize(k, 1) = Kq
End With
End Sub

Cảm ơn anh nhiều, em đã chạy được được rồi ạ!
 
Upvote 0
Nói về NGẮN thì cái này mới là NGẮN đây:
PHP:
Sub STT()
  With Range([C7], [C65536].End(xlUp)).Offset(, -2)
    .Value = "=IF(RC[2]="""","""",COUNTA(R7C3:RC3))"
    .Value = .Value
  End With
End Sub
Ẹc... Ẹc...
Tuy nhiên, ĐƠN GIẢN không tương đương với TỐC ĐỘ (mảng là vô địch)
Thầy ơi cho e hỏi làm thế nào cho code này nó tự động chạy ạ!
tức là khi mình nhập dữ liệu xong thì cột stt nó tự động đánh luôn không phải run lại macro nữa ý ạ
 
Upvote 0
cái này thì phải làm trong phần sự kiện. Tốt nhất là bạn gửi file lên để mọi người còn giúp bạn.
E cảm ơn thầy giáo, e có file này e muốn lập báo cáo chi tiết dựa vào dữ liệu trên sheet "PS" để lập vào sổ chi tiết công nợ phải thu, công nợ phải trả, và sổ kho. e nhờ các thầy giúp e code với ạ,
e mới tập tành VBA, cũng học hỏi của mỗi thầy trên GPE mỗi người 1í
Bài đã được tự động gộp:

Nói về NGẮN thì cái này mới là NGẮN đây:
PHP:
Sub STT()
  With Range([C7], [C65536].End(xlUp)).Offset(, -2)
    .Value = "=IF(RC[2]="""","""",COUNTA(R7C3:RC3))"
    .Value = .Value
  End With
End Sub
Ẹc... Ẹc...
Tuy nhiên, ĐƠN GIẢN không tương đương với TỐC ĐỘ (mảng là vô địch)
E cảm ơn thầy giáo, e có file này e muốn lập báo cáo chi tiết dựa vào dữ liệu trên sheet "PS" để lập vào sổ chi tiết công nợ phải thu, công nợ phải trả, và sổ kho. e nhờ các thầy giúp e code với ạ,
 

File đính kèm

Upvote 0
E cảm ơn thầy giáo, e có file này e muốn lập báo cáo chi tiết dựa vào dữ liệu trên sheet "PS" để lập vào sổ chi tiết công nợ phải thu, công nợ phải trả, và sổ kho. e nhờ các thầy giúp e code với ạ,
Bạn đưa bài vào sai chủ đề rồi. Vui lòng bạn lập chủ đề mới và trình bày rõ bạn cần giúp những gì, ví dụ như sổ chi tiết công nợ phải thu, công nợ phải trả, và sổ kho dữ liệu được lấy như thế nào từ sheet!PS
 
Upvote 0
Nói về NGẮN thì cái này mới là NGẮN đây:
PHP:
Sub STT()
  With Range([C7], [C65536].End(xlUp)).Offset(, -2)
    .Value = "=IF(RC[2]="""","""",COUNTA(R7C3:RC3))"
    .Value = .Value
  End With
End Sub
Ẹc... Ẹc...
Tuy nhiên, ĐƠN GIẢN không tương đương với TỐC ĐỘ (mảng là vô địch)
bác ơi cái đoạn này, đúng với số thôi, nhưng nếu số nó chỉ dạng thập phân 2 số 00-99 sau đó phải thay đổi sang A1=> A9, hết A9 lại sang B1=> B9... tiếp tục đếm tiếp đến hết, thì làm sao hả bác.
 
Upvote 0

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

Back
Top Bottom