Tự động thêm dòng bất kỳ theo điều kiện (1 người xem)

Liên hệ QC

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

グエン

Thành viên mới
Tham gia
26/6/21
Bài viết
9
Được thích
0
chào các bác em có đề bài như file đính kèm, các bác có cách nào để tự động thêm dòng và giá trị còn thiếu từ sheet 2 vào sheets 1 không ạ?
 

File đính kèm

Tạm thời là vầy, bạn kiểm tra thử:

PHP:
Sub TongHop2()
 Dim Rws As Long, W As Integer, J As Long
 Dim Cls As Range, sRng As Range, Rng As Range
 Dim MyAdd As String
 
 Rws = [B4].CurrentRegion.Rows.Count
 For J = 3 To Rws + 1
    Cells(J, "F").Value = Cells(J, "B").Value & "@" & Cells(J, "C").Value
 Next J
 ReDim Arr(1 To Rws, 1 To 4)
 Set Rng = [F3].Resize(Rws)
 [H4].Resize(Rws).Interior.ColorIndex = 0
 For Each Cls In Range([H4], [H4].End(xlDown))
    Set sRng = Rng.Find(Cls.Value & "@" & Cls.Offset(, 1).Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        W = W + 1:                          Arr(W, 1) = Cls.Value
        Arr(W, 2) = Cls.Offset(, 1).Value:  Arr(W, 4) = Cls.Offset(, 2).Value
    Else
        Cls.Interior.ColorIndex = 38
    End If
 Next Cls
 Set Rng = [B4].Resize(Rws)
 For Each Cls In Range([H4], [H4].End(xlDown))
    If Cls.Interior.ColorIndex = 38 Then
        Set sRng = Rng.Find(Cls.Value)
        If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
                If sRng.Offset(, 1).Value = Cls.Offset(, 1).Value Then
                    sRng.Offset(, 3).Value = Cls.Offset(, 2).Value
                End If
                Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
        End If
    End If
 Next Cls
 If W Then
    [B4].End(xlDown).Offset(1).Resize(W, 4).Value = Arr()
 End If
End Sub
 
chào các bác em có đề bài như file đính kèm, các bác có cách nào để tự động thêm dòng và giá trị còn thiếu từ sheet 2 vào sheets 1 không ạ?
Với dữ liệu không nhiều, chạy sub
Mã:
Sub ABC()
  Dim aMay(), aMay2(), Res(), sR&, sR2&, i&, r&, k&, sp$, lop$
With Sheets("Sheet1")
  aMay = .Range("B4:D" & .Range("C" & Rows.Count).End(xlUp).Row).Value
  aMay2 = .Range("H4:J" & .Range("H" & Rows.Count).End(xlUp).Row).Value
  sR = UBound(aMay): sR2 = UBound(aMay2)
  ReDim Res(1 To sR + sR2, 1 To 4)
  For r = 1 To sR
    Res(r, 1) = aMay(r, 1): Res(r, 2) = aMay(r, 2): Res(r, 3) = aMay(r, 3)
  Next r
  k = r - 1
  For i = 1 To sR2
    sp = aMay2(i, 1): lop = aMay2(i, 2)
    For r = 1 To sR
      If sp = aMay(r, 1) Then
        If lop = aMay(r, 2) Then Res(r, 4) = aMay2(i, 3): Exit For
      End If
    Next r
    If r = sR + 1 Then
      k = k + 1
      Res(k, 1) = aMay2(i, 1): Res(k, 2) = aMay2(i, 2): Res(k, 4) = aMay2(i, 3)
    End If
  Next i
  .Range("N4").Resize(k, 4) = Res
  .Range("N4").Resize(k, 4).Sort .[N4], 1, .[O4], , 1, Header:=xlNo
End With
End Sub
 
Lần chỉnh sửa cuối:
Cảm ơn bác Hiếu CD. Nhưng vs vài nghìn dữ liệu thì dùng hàm nào ah?
Bài đã được tự động gộp:

Cảm ơn bác SA_DQ. Em đã test có ra kết quả nhưng những dữ liệu bổ sung thì đi thêm vào cuối bảng ah. em muốn sắp xếp theo thứ tự SP và LOP thì nên làm như thế nào ah.
 
Lần chỉnh sửa cuối:
. . . .. Em đã test có ra kết quả nhưng những dữ liệu bổ sung thì đi thêm vào cuối bảng ah. em muốn sắp xếp theo thứ tự SP và LOP thì nên làm như thế nào ah.
Thì thêm động tác sắp xếp & đánh lại STT; Chuyện này có thể làm bằng thủ công hay tự động đều được.

Nhưng bạn phải đồng ý là đã thực hiện theo iêu cầu này của bạn rồi chứ:
Tự động thêm dòng bất kỳ theo điều kiện

chào các bác em có đề bài như file đính kèm, các bác có cách nào để tự động thêm dòng và giá trị còn thiếu từ sheet 2 vào sheets 1 không ạ?

 
Cảm ơn bác Hiếu CD. Nhưng vs vài nghìn dữ liệu thì dùng hàm nào ah?
Bài đã được tự động gộp:

Cảm ơn bác SA_DQ. Em đã test có ra kết quả nhưng những dữ liệu bổ sung thì đi thêm vào cuối bảng ah. em muốn sắp xếp theo thứ tự SP và LOP thì nên làm như thế nào ah.
Sub mới tốc độ nhanh hơn
Mã:
Sub ABC()
  Dim aMay(), aMay2(), Res(), dic As Object, sR&, sR2&, i&, iR&, k&, iKey$

  Set dic = CreateObject("scripting.dictionary")
  With Sheets("Sheet1")
    aMay = .Range("B4:D" & .Range("C" & Rows.Count).End(xlUp).Row).Value
    aMay2 = .Range("H4:J" & .Range("H" & Rows.Count).End(xlUp).Row).Value
    sR = UBound(aMay): sR2 = UBound(aMay2)
    ReDim Res(1 To sR + sR2, 1 To 4)
    For k = 1 To sR
      Res(k, 1) = aMay(k, 1): Res(k, 2) = aMay(k, 2): Res(k, 3) = aMay(k, 3)
      dic.Item(aMay(k, 1) & "|" & aMay(k, 2)) = k
    Next k
    k = k - 1
    For i = 1 To sR2
      iKey = aMay2(i, 1) & "|" & aMay2(i, 2)
      If dic.exists(iKey) = False Then
        k = k + 1
        dic.Add iKey, k
        Res(k, 1) = aMay2(i, 1): Res(k, 2) = aMay2(i, 2)
      End If
      iR = dic.Item(iKey)
      Res(iR, 4) = aMay2(i, 3)
    Next i
    .Range("N4").Resize(k, 4) = Res
    .Range("N4").Resize(k, 4).Sort .[N4], 1, .[O4], , 1, Header:=xlNo
  End With
End Sub
 
Bác HiếuCD ơi để giải quyết được triệt để hơn em muốn hỏi thêm là: với code hiện tại giá trị trả về thì những dữ liệu trùng giữa máy 1 và máy 2 thì cột máy 2 lại k tự động điền x hay o, để thêm bước này thì nên làm như thế nào ạ?
 
Bác HiếuCD ơi để giải quyết được triệt để hơn em muốn hỏi thêm là: với code hiện tại giá trị trả về thì những dữ liệu trùng giữa máy 1 và máy 2 thì cột máy 2 lại k tự động điền x hay o, để thêm bước này thì nên làm như thế nào ạ?

Hãy tải lên tập tin có dòng dữ liệu không tự động điền X hay o.

.
 
Bác HiếuCD ơi để giải quyết được triệt để hơn em muốn hỏi thêm là: với code hiện tại giá trị trả về thì những dữ liệu trùng giữa máy 1 và máy 2 thì cột máy 2 lại k tự động điền x hay o, để thêm bước này thì nên làm như thế nào ạ?
Code tự điền dữ liệu trùng mờ
 
Dạ bác HiếuCD file đây ạ, đã ra kết quả như mong muốn nhưng dòng tiêu đêff bị nhảy xuống cuối bảng tính ạ.
em muốn hỏi thêm nữa là em muốn chạy và trả ra kết quả trực tiếp trên sheet 1 thì làm như thế nào ạ?
 

File đính kèm

Bác SA_DQ ơi trong trường hợp thực tế bảng tính sẽ có nhiều cột nhiều hàng hơn muốn áp dụng code này thì những vị trí nào cần thay đổi trong code ạ.
Bác có thể chỉ cho em được không ạ?
Bài đã được tự động gộp:

Bác SA_DQ ơi trong trường hợp thực tế bảng tính sẽ có nhiều cột nhiều hàng hơn muốn áp dụng code này thì những vị trí nào cần thay đổi trong code ạ.
Bác có thể chỉ cho em được không ạ?
 
Thay đổi phải là theo các chỉ số cột trên trang tính => như vậy ta phải biết thiết kế của trang tính mới mới thực tế được.
Về 'lí thuyết' thì chương trình gồm các bước:
1./ Tạo cột phụ tại cột trống cuối của trang Sh1 để chứa dữ liệu kết nối giữa SF & Lớp
2./ Tạo vòng lặp để tìm dữ liệu từ Sh2 trên cột phụ này;
Nếu tìm không có thì ghi vô biến mảng & tô màu đã định lên các ô có tìm thấy (ở Sh2)
Hết chu trình tìm kiếm này thì ghi dữ liệu từ mảng (vừa thu thập được) lên dòng cuối trang Sh1
3./ Lại tìm trên cột dầu (SF) những ô đã tô màu để chép máy 2 cho cùng dòng.

Tóm lại là phải có thiết kế 2 Sh2 & Sh1 mới cụ thể được.
 
Lần chỉnh sửa cuối:
OK

Sub TongHop_A()
Dim Rws As Long, W As Integer, J As Long
Dim Cls As Range, sRng As Range, Rng As Range
Dim MyAdd As String

Rws = [C28].CurrentRegion.Rows.Count '4 '
For J = 27 To Rws + 28 '3 - 28 '
Cells(J, "A").Value = Cells(J, "C").Value & "@" & Cells(J, "D").Value 'F '
Next J
ReDim Arr(1 To Rws, 1 To 14) '? 3 '
Set Rng = [A27].Resize(Rws) 'F3 '
[S28].Resize(Rws).Interior.ColorIndex = 0 'H4 '
For Each Cls In Range([S28], [S28].End(xlDown)) 'H4 '
Set sRng = Rng.Find(Cls.Value & "@" & Cls.Offset(, 1).Value, , xlFormulas, xlWhole)
If sRng Is Nothing Then
W = W + 1: Arr(W, 1) = Cls.Value
Arr(W, 2) = Cls.Offset(, 1).Value: Arr(W, 11) = Cls.Offset(, 2).Value
Else
Cls.Interior.ColorIndex = 38
End If
Next Cls


Set Rng = [C28].Resize(Rws)
For Each Cls In Range([S28], [S28].End(xlDown))
If Cls.Interior.ColorIndex = 38 Then
Set sRng = Rng.Find(Cls.Value)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
If sRng.Offset(, 1).Value = Cls.Offset(, 1).Value Then
sRng.Offset(, 10).Value = Cls.Offset(, 2).Value
End If
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
End If
End If
Next Cls

If W Then
[C28].End(xlDown).Offset(1).Resize(W, 13).Value = Arr() 'B4 Resize(3)'
End If
End Sub
 
Lần chỉnh sửa cuối:
Bạn làm như mình biết loại ngôn ngữ đông bắc Á này vậy!

適用検索条件必須条件優先順位レジスト種別解除可能
フラグ
KRF-SCN-L01KRF-SCN-L02KRF-SCN-L03KRF-SCN-L04検索条件使用
フラグ
品種グループIDレイヤIDレシピIDロットID装置IDレチクルIDレチクル位置品種グループIDレイヤID
Y103SC10ERFCNOD****1L41Y103SC10ERFCNOD103SC10ERFCNOD
1​
Y103SC10ERFLNOD****1L41Y103SC10ERFLNOD103SC10ERFLNOD
2​
Y103SC10ERFLNOD_3002****1L43Y103SC10ERFLPOD103SC10ERFLPOD
4​
Y103SC10ERFLPOD****1L41Y103SC10ERFMNOD103SC10ERFMNOD
5​
Y103SC10ERFMNOD****1L41Y103SC10ERFMPOD103SC10ERFMPOD
7​
Y103SC10ERFMNOD_3002****1L43Y103SC10ERFNDOD103SC10ERFNDOD×
8​
Y103SC10ERFMPOD****1L41Y103SC10ERFNFOD103SC10ERFNFOD
10​
Y103SC10ERFNDOD****1L41Y×103SC10ERFNIOD103SC10ERFNIODNG
Y103SC10ERFNDOD_3002****1L43Y103SC10ERFNSOD103SC10ERFNSODNG
Y103SC10ERFNFOD****1L41Y103SC10ERFPD103SC10ERFPD×NG
Y103SC10ERFNFOD_3002****1L43Y103SC10ERFPDOD103SC10ERFPDOD×NG
 
Lần chỉnh sửa cuối:
Tạm 2 công đoạn, còn công đoạn thứ 3 thì chưa hiểu ra làm sao:

PHP:
Sub TongHop_A()
 Dim Rws As Long, W As Integer, J As Long
 Dim Cls As Range, sRng As Range, Rng As Range
 Dim MyAdd As String
 
 Rws = [B28].CurrentRegion.Rows.Count    '4  '
 For J = 27 To Rws + 28                       '3 -  28  '
    Cells(J, "A").Value = Cells(J, "C").Value & "@" & Cells(J, "D").Value   'F  '
 Next J
 ReDim Arr(1 To Rws, 1 To 4)        '?  3   '
 Set Rng = [A27].Resize(Rws)     'F3 '
 [s27].Resize(Rws).Interior.ColorIndex = 0   'H4 '
 For Each Cls In Range([s27], [s27].End(xlDown)) 'H4 '
    Set sRng = Rng.Find(Cls.Value & "@" & Cls.Offset(, 1).Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        W = W + 1:                          Arr(W, 1) = Cls.Value
        Arr(W, 2) = Cls.Offset(, 1).Value:  Arr(W, 3) = Cls.Offset(, 2).Value   '/  4   '
    Else
        Cls.Interior.ColorIndex = 38
    End If
 Next Cls
 GoTo GPE
 
 Set Rng = [B4].Resize(Rws)
 For Each Cls In Range([H4], [H4].End(xlDown))
    If Cls.Interior.ColorIndex = 38 Then
        Set sRng = Rng.Find(Cls.Value)
        If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
                If sRng.Offset(, 1).Value = Cls.Offset(, 1).Value Then
                    sRng.Offset(, 3).Value = Cls.Offset(, 2).Value
                End If
                Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
        End If
    End If
 Next Cls
GPE:
 If W Then
    [c27].End(xlDown).Offset(1).Resize(W, 3).Value = Arr()   'B4  Resize(3)'
 End If
End Sub
 
Tạm 2 công đoạn, còn công đoạn thứ 3 thì chưa hiểu ra làm sao:

PHP:
Sub TongHop_A()
 Dim Rws As Long, W As Integer, J As Long
 Dim Cls As Range, sRng As Range, Rng As Range
 Dim MyAdd As String
 
 Rws = [B28].CurrentRegion.Rows.Count    '4  '
 For J = 27 To Rws + 28                       '3 -  28  '
    Cells(J, "A").Value = Cells(J, "C").Value & "@" & Cells(J, "D").Value   'F  '
 Next J
 ReDim Arr(1 To Rws, 1 To 4)        '?  3   '
 Set Rng = [A27].Resize(Rws)     'F3 '
 [s27].Resize(Rws).Interior.ColorIndex = 0   'H4 '
 For Each Cls In Range([s27], [s27].End(xlDown)) 'H4 '
    Set sRng = Rng.Find(Cls.Value & "@" & Cls.Offset(, 1).Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        W = W + 1:                          Arr(W, 1) = Cls.Value
        Arr(W, 2) = Cls.Offset(, 1).Value:  Arr(W, 3) = Cls.Offset(, 2).Value   '/  4   '
    Else
        Cls.Interior.ColorIndex = 38
    End If
 Next Cls
 GoTo GPE
 
 Set Rng = [B4].Resize(Rws)
 For Each Cls In Range([H4], [H4].End(xlDown))
    If Cls.Interior.ColorIndex = 38 Then
        Set sRng = Rng.Find(Cls.Value)
        If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
                If sRng.Offset(, 1).Value = Cls.Offset(, 1).Value Then
                    sRng.Offset(, 3).Value = Cls.Offset(, 2).Value
                End If
                Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
        End If
    End If
 Next Cls
GPE:
 If W Then
    [c27].End(xlDown).Offset(1).Resize(W, 3).Value = Arr()   'B4  Resize(3)'
 End If
End Sub
Em sửa được rồi bác ah, nhưng muốn chèn dòng bất kì theo thứ tự từ A~Z thì sử dụng câu lệnh như thế nào?
bác biết không chỉ cho em với.

Sub TongHop_A()
Dim Rws As Long, W As Integer, J As Long
Dim Cls As Range, sRng As Range, Rng As Range
Dim MyAdd As String

Rws = [C28].CurrentRegion.Rows.Count '4 '
For J = 27 To Rws + 28 '3 - 28 '
Cells(J, "A").Value = Cells(J, "C").Value & "@" & Cells(J, "D").Value 'F '
Next J
ReDim Arr(1 To Rws, 1 To 14) '? 3 '
Set Rng = [A27].Resize(Rws) 'F3 '
[S28].Resize(Rws).Interior.ColorIndex = 0 'H4 '
For Each Cls In Range([S28], [S28].End(xlDown)) 'H4 '
Set sRng = Rng.Find(Cls.Value & "@" & Cls.Offset(, 1).Value, , xlFormulas, xlWhole)
If sRng Is Nothing Then
W = W + 1: Arr(W, 1) = Cls.Value
Arr(W, 2) = Cls.Offset(, 1).Value: Arr(W, 11) = Cls.Offset(, 2).Value
Else
Cls.Interior.ColorIndex = 38
End If
Next Cls


Set Rng = [C28].Resize(Rws)
For Each Cls In Range([S28], [S28].End(xlDown))
If Cls.Interior.ColorIndex = 38 Then
Set sRng = Rng.Find(Cls.Value)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
If sRng.Offset(, 1).Value = Cls.Offset(, 1).Value Then
sRng.Offset(, 10).Value = Cls.Offset(, 2).Value
End If
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
End If
End If
Next Cls

If W Then
[C28].End(xlDown).Offset(1).Resize(W, 13).Value = Arr() 'B4 Resize(3)'
End If
End Sub
 
Lần chỉnh sửa cuối:
Dạ bác HiếuCD file đây ạ, đã ra kết quả như mong muốn nhưng dòng tiêu đêff bị nhảy xuống cuối bảng tính ạ.
em muốn hỏi thêm nữa là em muốn chạy và trả ra kết quả trực tiếp trên sheet 1 thì làm như thế nào ạ?
Dữ liệu file mới khác thứ tự dòng với file bài #1, khi áp dụng vào file thực tế phải tự chỉnh địa chỉ mới
Bài đã được tự động gộp:

Dạ bác HiếuCD file đây ạ, đã ra kết quả như mong muốn nhưng dòng tiêu đêff bị nhảy xuống cuối bảng tính ạ.
em muốn hỏi thêm nữa là em muốn chạy và trả ra kết quả trực tiếp trên sheet 1 thì làm như thế nào ạ?
Dữ liệu file mới khác thứ tự dòng với file bài #1, khi áp dụng vào file thực tế phải tự chỉnh địa chỉ mới
 
Web KT

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

Back
Top Bottom