Nhờ check hộ tại sao đoạn Code trên của mình lại không chạy (Đưa bài dùm 1 bạn.)

Liên hệ QC

ChanhTQ@

0901452không62
Tham gia
5/9/08
Bài viết
4,254
Được thích
4,861
Mình có một bảng excel gồm 2 sheet.
Sheet1 có cột A (bắt đầu tính từ A2) và cột B bắt đầu từ ô B2 trở xuống khoảng 3-4 vạn dòng.
Sheet2 có cột A (bắt đầu tính từ A2) và cột B bắt đầu từ ô B2 trở xuống và ô cột F
Là mình muốn lấy gốc là ô A2 và B2 (lấy cùng một lúc) của sheet 1 và tìm so sánh với các trị của cột A,B của sheet 2; Nếu như nhau thì lấy giá trị ở cột F tuơng ứng (của theo dòng tương ứng).
Giả sử ô A3 và ô B3 (sheet 1) bằng ô A4 và ô B4 của sheet 2 thì ô C3 của sheet 1 sẽ lấy giá trị của ô C4 của sheet 2 .Bởi vì bảng tính của mình rất dài (có thể lên đến 40.000 dòng) nên nếu mà tìm thủ công thì rất là lâu và không hiệu quả. mong được giúp đỡ.

PHP:
Sub Update()
 
 Dim Rgn1 As Range, Rgn2 As Range
 Dim i As Integer, j As Integer
 
Set Rgn1 = Range("Sheet1!A2:B10000")
Set Rgn2 = Range("Sheet2!A2:B10000")
 
For i = 1 To Rgn1.Rows.Count
   If (Rgn1.Item(i + 1, 1) = Rgn2.Item(2, 1)) And (Rgn1.Item(i + 1, 2) = Rgn2.Item(2, 2)) Then
'tìm ?u+o+.c pha^`n tu+? o+? hàng i ca^`n hie^.u chi?nh'
      Rgn1.Item(i + 1, 3) = Rgn2.Item(i + 1, 3)
   End If
Next i
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
1/Mình không quan tâm ý nghĩa các phép toán, mà chỉ chú ý việc sai cú pháp dẫn đến code không chạy. Bạn sai cú pháp 2 dòng set Range và sửa lại như sau:

Set Rgn1 = Range("Sheet1!A2:B10000")
Set Rgn2 = Range("Sheet2!A2:B10000")

Sửa thành:

Set Rgn1 = Sheet1.Range("A2:B10000")
Set Rgn2 = Sheet2.Range("A2:B10000")

2/ Code của bạn nên sửa như sau tốc độ khá hơn:

Mã:
Sub Update1()
 Dim Tmp1, Tmp2
 Dim i As Integer, j As Integer
Tmp1 = Sheet1.Range("A2:F10000")
Tmp2 = Sheet2.Range("A2:F10000")
For i = 1 To UBound(Tmp1, 1)
For j = 1 To UBound(Tmp2, 1)
If Tmp1(i, 1) = Tmp2(j, 1) And Tmp1(i, 2) _
= Tmp2(j, 2) Then Tmp1(i, 6) = Tmp2(j, 6)
Next
Next
Sheet1.Range("A2:F10000") = Tmp1
End Sub


 
Lần chỉnh sửa cuối:
Upvote 0
Mình có một bảng excel gồm 2 sheet.
Sheet1 có cột A (bắt đầu tính từ A2) và cột B bắt đầu từ ô B2 trở xuống khoảng 3-4 vạn dòng.
Sheet2 có cột A (bắt đầu tính từ A2) và cột B bắt đầu từ ô B2 trở xuống và ô cột F
Là mình muốn lấy gốc là ô A2 và B2 (lấy cùng một lúc) của sheet 1 và tìm so sánh với các trị của cột A,B của sheet 2; Nếu như nhau thì lấy giá trị ở cột F tuơng ứng (của theo dòng tương ứng).
Giả sử ô A3 và ô B3 (sheet 1) bằng ô A4 và ô B4 của sheet 2 thì ô C3 của sheet 1 sẽ lấy giá trị của ô C4 của sheet 2 .Bởi vì bảng tính của mình rất dài (có thể lên đến 40.000 dòng) nên nếu mà tìm thủ công thì rất là lâu và không hiệu quả. mong được giúp đỡ.

PHP:
Sub Update()
 
 Dim Rgn1 As Range, Rgn2 As Range
 Dim i As Integer, j As Integer
 
Set Rgn1 = Range("Sheet1!A2:B10000")
Set Rgn2 = Range("Sheet2!A2:B10000")
 
For i = 1 To Rgn1.Rows.Count
   If (Rgn1.Item(i + 1, 1) = Rgn2.Item(2, 1)) And (Rgn1.Item(i + 1, 2) = Rgn2.Item(2, 2)) Then
'tìm ?u+o+.c pha^`n tu+? o+? hàng i ca^`n hie^.u chi?nh'
      Rgn1.Item(i + 1, 3) = Rgn2.Item(i + 1, 3)
   End If
Next i
End Sub
Đoán không lầm thì bài này của bạn tuangiang25022008 nhờ giúp
Bạn ấy có hỏi và em đã làm rồi nhưng có lẽ bạn ấy không biết cách tùy biến vào file mình chăng (lúc hỏi thì bảo lấy dữ liệu tại cột C, còn thực tế thì lấy ở cột F)
PHP:
Sub Update()
  Dim sArr1, sArr2, Tmp1 As String, Tmp2 As String, Tmp3, Dic, rArr()
  Dim iR1 As Long, iR2 As Long, n As Long, dur As Double
  dur = Timer
  sArr1 = Sheet1.Range("A2:C60000").Value
  sArr2 = Sheet2.Range("A2:F60000").Value
  ReDim rArr(1 To UBound(sArr1, 1), 1 To 1)
  Set Dic = CreateObject("Scripting.Dictionary")
  For iR2 = 1 To UBound(sArr2, 1)
    Tmp2 = sArr2(iR2, 1) & sArr2(iR2, 2)
    Tmp3 = sArr2(iR2, 6)
    If Tmp2 <> "" Then
      If Not Dic.Exists(Tmp2) Then Dic.Add Tmp2, Tmp3
    End If
  Next iR2
  For iR1 = 1 To UBound(sArr1, 1)
    Tmp1 = sArr1(iR1, 1) & sArr1(iR1, 2)
    If Tmp1 <> "" Then
      If Dic.Exists(Tmp1) Then
        rArr(iR1, 1) = Dic.Item(Tmp1)
      End If
    End If
  Next iR1
  Sheet1.Range("C2:C60000").Value = rArr
  MsgBox Timer - dur
End Sub
Với dữ liệu 60000 dòng, ra kết quả trong vòng dưới 1 giây
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
cám ơn tất cả các bạn.
Đây là vấn đề làm mình rất đau đầu từ khoảng nửa năm nay.
Mình mày mò trên mạng mà không có bài mình cần và không biết hỏi ai?
Nói như thế nào để người ta hiểu được cái mình đang hỏi.
Mình cám ơn các bạn trên diễn đàn đã giúp mình.
Chúc các bạn những lời chúc tốt đẹp nhất.
ah quên Ndu cho mình hỏi thêm nếu dữ liệu ở sheet 1 và sheet 2 của mình lớn hơn 70000 dòng (lúc này mình dùng excel 2007) thì mình là như thế nào. bởi vì excel 2003 chỉ có <65600 dòng thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom