Chuyển một phần dữ liệu theo điều kiện

Liên hệ QC

FUN FUN

Thành viên mới
Tham gia
18/11/07
Bài viết
32
Được thích
9
Mình có file macro, nhưng chưa biết viết code như thế nào cho trường hợp này, nếu Record Macro thì trong nội dung là "=công thức", mình cảm thấy làm như vậy sẽ làm file nặng lên nhiều. Các bạn xem giúp theo file đính kèm, xin chỉ cao kiến với.
 

File đính kèm

  • Chuyen_mot_phan_du_lieu.xlsx
    9.9 KB · Đọc: 10
Mình có file macro, nhưng chưa biết viết code như thế nào cho trường hợp này, nếu Record Macro thì trong nội dung là "=công thức", mình cảm thấy làm như vậy sẽ làm file nặng lên nhiều. Các bạn xem giúp theo file đính kèm, xin chỉ cao kiến với.
Chạy code, kết quả là ký tự số
Mã:
Sub ABC()
  Dim sArr(), Res() As String, Res2() As String
  Dim sRow&, i&, tk$
 
  With Sheet1
    i = .Range("M" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("F2:N" & i).Value
 
    sRow = UBound(sArr)
    ReDim Res(1 To sRow, 1 To 1)
    ReDim Res2(1 To sRow, 1 To 2)
    For i = 1 To sRow
      If sArr(i, 1) Like "T?I KHO?N*" Then
        tk = Right(sArr(i, 1), 4)
      ElseIf sArr(i, 9) <> Empty Then
        Res2(i, 2) = Right(sArr(i, 9), 4)
      End If
      Res(i, 1) = tk
      If sArr(i, 5) <> Empty Then
        j = InStr(1, sArr(i, 5), "]")
        If j > 0 Then Res2(i, 1) = Mid(sArr(i, 5), 2, j - 2)
      End If
    Next i
    .Range("A2").Resize(sRow) = Res
    .Range("C2").Resize(sRow, 2) = Res2
  End With
End Sub
 
Upvote 0
Chạy code, kết quả là ký tự số
Mã:
Sub ABC()
  Dim sArr(), Res() As String, Res2() As String
  Dim sRow&, i&, tk$

  With Sheet1
    i = .Range("M" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("F2:N" & i).Value

    sRow = UBound(sArr)
    ReDim Res(1 To sRow, 1 To 1)
    ReDim Res2(1 To sRow, 1 To 2)
    For i = 1 To sRow
      If sArr(i, 1) Like "T?I KHO?N*" Then
        tk = Right(sArr(i, 1), 4)
      ElseIf sArr(i, 9) <> Empty Then
        Res2(i, 2) = Right(sArr(i, 9), 4)
      End If
      Res(i, 1) = tk
      If sArr(i, 5) <> Empty Then
        j = InStr(1, sArr(i, 5), "]")
        If j > 0 Then Res2(i, 1) = Mid(sArr(i, 5), 2, j - 2)
      End If
    Next i
    .Range("A2").Resize(sRow) = Res
    .Range("C2").Resize(sRow, 2) = Res2
  End With
End Sub
Cảm ơn bann, để tí nữa mình chạy thử. Trước mình thấy bạn viết code chạy rất nhanh, bạn có thể viết giúp vài dòng diễn giải với được không, mình muốn viết được code như bạn mà chưa hiểu cách viết lắm. Cảm ơn bạn
 
Upvote 0
Cảm ơn bann, để tí nữa mình chạy thử. Trước mình thấy bạn viết code chạy rất nhanh, bạn có thể viết giúp vài dòng diễn giải với được không, mình muốn viết được code như bạn mà chưa hiểu cách viết lắm. Cảm ơn bạn
Xem ghi chú trong code
Mã:
Sub ABC()
  Dim sArr()
  Dim Res() As String, Res2() As String 'Mang ket qua là chuoi
  Dim sRow&, i&, tk$
 
  With Sheet1
    i = .Range("M" & Rows.Count).End(xlUp).Row 'Dòng cuoi cot M
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("F2:N" & i).Value 'Gan mang du lieu sArr
 
    sRow = UBound(sArr) ' So dong cua mang du lieu
    ReDim Res(1 To sRow, 1 To 1) 'Ket qua cot TK
    ReDim Res2(1 To sRow, 1 To 2) 'Ket qua 2 cot MSTDN, NDKT
    For i = 1 To sRow
      If sArr(i, 1) Like "T?I KHO?N*" Then 'Neu cot "F" có tu dau là "T?I KHO?N" thì
        tk = Right(sArr(i, 1), 4) 'So hieu TK
      ElseIf sArr(i, 9) <> Empty Then 'Neu khong dung và cot "N" khac Empty thì
        Res2(i, 2) = Right(sArr(i, 9), 4) 'Gan ket qua cot "MSTDN"
      End If
      Res(i, 1) = tk 'Gan ket qua cot "TK"
      If sArr(i, 5) <> Empty Then 'Neu cot "J" khac Empty thì
        j = InStr(1, sArr(i, 5), "]") 'tìm vi tri ky tu "]"
        If j > 0 Then Res2(i, 1) = Mid(sArr(i, 5), 2, j - 2) 'Neu có "]" gan ket qua cot "NDKT"
      End If
    Next i
    .Range("A2").Resize(sRow) = Res 'Gan Res vao sheet1
    .Range("C2").Resize(sRow, 2) = Res2 'Gan Res2 vao sheet1 theo 2 cot
  End With
End Sub
 
Upvote 0
Mình có file macro, nhưng chưa biết viết code như thế nào cho trường hợp này, nếu Record Macro thì trong nội dung là "=công thức", mình cảm thấy làm như vậy sẽ làm file nặng lên nhiều. Các bạn xem giúp theo file đính kèm, xin chỉ cao kiến với.
Nếu cột B không có gì thì bạn xem file này, Nếu cột B có sẵn dữ liệu thì tính sau.
 

File đính kèm

  • Chuyen_mot_phan_du_lieu.rar
    16.5 KB · Đọc: 4
Upvote 0
Hic, do đang lấy số liệu làm báo cáo nên chưa chỉnh sửa code để chạy file được. Cảm ơn các bạn đã hỗ trợ rất nhiệt tình...
 
Upvote 0
Nếu cột B không có gì thì bạn xem file này, Nếu cột B có sẵn dữ liệu thì tính sau.
Thanks bạn, nhưng cho mình hỏi vấn đề này: khi mình ghép vào file của mình thì phần mã số thuế của doanh nghiệp nó về dạng số (mất số 0 ở đầu). Xin bạn cho cách xử lý
 
Upvote 0
Xem ghi chú trong code
Mã:
Sub ABC()
  Dim sArr()
  Dim Res() As String, Res2() As String 'Mang ket qua là chuoi
  Dim sRow&, i&, tk$

  With Sheet1
    i = .Range("M" & Rows.Count).End(xlUp).Row 'Dòng cuoi cot M
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("F2:N" & i).Value 'Gan mang du lieu sArr

    sRow = UBound(sArr) ' So dong cua mang du lieu
    ReDim Res(1 To sRow, 1 To 1) 'Ket qua cot TK
    ReDim Res2(1 To sRow, 1 To 2) 'Ket qua 2 cot MSTDN, NDKT
    For i = 1 To sRow
      If sArr(i, 1) Like "T?I KHO?N*" Then 'Neu cot "F" có tu dau là "T?I KHO?N" thì
        tk = Right(sArr(i, 1), 4) 'So hieu TK
      ElseIf sArr(i, 9) <> Empty Then 'Neu khong dung và cot "N" khac Empty thì
        Res2(i, 2) = Right(sArr(i, 9), 4) 'Gan ket qua cot "MSTDN"
      End If
      Res(i, 1) = tk 'Gan ket qua cot "TK"
      If sArr(i, 5) <> Empty Then 'Neu cot "J" khac Empty thì
        j = InStr(1, sArr(i, 5), "]") 'tìm vi tri ky tu "]"
        If j > 0 Then Res2(i, 1) = Mid(sArr(i, 5), 2, j - 2) 'Neu có "]" gan ket qua cot "NDKT"
      End If
    Next i
    .Range("A2").Resize(sRow) = Res 'Gan Res vao sheet1
    .Range("C2").Resize(sRow, 2) = Res2 'Gan Res2 vao sheet1 theo 2 cot
  End With
End Sub
Xin lỗi, mình làm phiền xíu, mình thấy cách khai báo biến lạ lạ như sau: Dim sRow&, i&, tk$ nhờ bạn giải thích giúp. Thanks bạn, code chạy rất nhanh.
 
Upvote 0
Xin lỗi, mình làm phiền xíu, mình thấy cách khai báo biến lạ lạ như sau: Dim sRow&, i&, tk$ nhờ bạn giải thích giúp. Thanks bạn, code chạy rất nhanh.
Đang ngâm cứu mảng thấy bài Thầy @HieuCD code có comment hay quá.
Xin phép bù thêm cách viết tắt seach được của bác @kyo là:
String $
Integer %
Long &
Single !
Double #
Currency @
 
Upvote 0
Upvote 0
Ko cần nhớ, chỉ đầu code ghi chú cái rồi khi nào cần xài, lâu thành thói quen
Thói quen của mình, cũng chỉ một mình mình đọc hiểu. Còn chuyện tường minh "String, Long, Double..." vạn người hiểu sao làm biếng gõ?
Viết cho một mình mình xài thì vô tư.
Tôi thì không "khoái" kiểu viết vậy. Tùy mọi người thôi.
""""""""""" "Ko" tôi đã chán rồi!
 
Upvote 0
Thói quen của mình, cũng chỉ một mình mình đọc hiểu. Còn chuyện tường minh "String, Long, Double..." vạn người hiểu sao làm biếng gõ?
Viết cho một mình mình xài thì vô tư.
Tôi thì không "khoái" kiểu viết vậy. Tùy mọi người thôi.
""""""""""" "Ko" tôi đã chán rồi!
Mình mới tập viết, để hiểu được ý người viết thì cần tự trang bị cho mình kiến thức, chứ để lần nào cũng hỏi thì hơi ngại.
 
Upvote 0
Thói quen của mình, cũng chỉ một mình mình đọc hiểu. Còn chuyện tường minh "String, Long, Double..." vạn người hiểu sao làm biếng gõ?
Viết cho một mình mình xài thì vô tư.
Tôi thì không "khoái" kiểu viết vậy. Tùy mọi người thôi.
""""""""""" "Ko" tôi đã chán rồi!
Thực ra $, %, ... cũng không hẳn là không tường minh. Đọc quen rồi thì cũng dễ hiểu.

Chỉ là ở code này, cách viết không thống nhất lắm:
Dim Res() As String, Res2() As String 'Mang ket qua là chuoi
Dim sRow&, i&, tk$
...
Nếu muốn viết theo kiểu vắn tắt thì đáng lẽ phải là:
Dim Res$(), Res2$() 'Mang ket qua là chuoi
 
Upvote 0
Nếu bộ nhớ hết date thì "không tường minh" do không nạp vào được :p :p
Hết đát như tôi mà vẫn nhớ như in $ là String và % Integer.
(các dấu ký tự khác chúng là đồ mới, không thể nói chuyện đát được. Riêng $ và % thì có từ đầu thập niên 60's)

Tuy nhiên, dẫu không dùng trong khai báo, quý vị cũng nên học thuộc bản ký tự này. Vì chúng đôi lúc cũng cần cho hằng.

Ví dụ:
a = 10 ' 10 ở đây là một hằng
VBA tự động coi 10 là Integer, và tuỳ theo a là cái gì mà ép kiểu để gán. Nếu a là Variant thì khỏi ép kiểu.
Nhưng nếu bạn viết:
a = 10&
Thì VBA coi số 10 là Long.

Tôi đã từng trải qua kinh nghiệm code bị "hư" vì kiểu của hằng không tường minh rồi. Trong nhất thời, tôi chưa nhớ ra trường hợp điển hình.
 
Upvote 0
Cho em hỏi là em đang muốn viết code để có thể chọn số dòng bất kỳ từ sheet TDKQ để copy sang sheet PTKQ thì viết code như nào ạ? Mong được giúp đỡ. Em cảm ơn nhiều
 

File đính kèm

  • Kết quả phân tích.xlsm
    71.2 KB · Đọc: 4
Upvote 0
Web KT

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

Back
Top Bottom