Code VB trong excel (1 người xem)

Liên hệ QC

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

thutran0801

Thành viên chính thức
Tham gia
19/8/16
Bài viết
61
Được thích
1
Xin chào, đây là lần 2 mình đăng bài xin giúp đỡ
Hiện tại mình có bài như thế này có 3 file excel 1 file input chứa dữ liệu chính 1 file output lấy dữ liệu từ file input qua nhờ 1 file nữa là file code, file code này sẽ có nơi cho phép mình nhập tên của các file in và out khi chọn vào nút copy thì DIEMDIEM TB sẽ được lấy từ file input sang output nhưng theo thứ tự Ten mon của file output
Xin giúp đỡ ạ!!
 

File đính kèm

  • File test.rar
    File test.rar
    21.6 KB · Đọc: 21
  • Capture.jpg
    Capture.jpg
    32 KB · Đọc: 12
Bạn có cách nào để lấy dựa theo Ma mon kon vi ten mon đôi khi ko chính xác ví dụ như ở input thì ten mon là Toan nhưng ở output thì lại là Toan.1 chẳng hạn..mình thử dùng index rồi nhưng ko đc..xin lỗi làm phiền bạn quá
Bạn phải nhập lại mã môn cho đúng
Mã:
Sub Copy()
Dim OutW As Workbook, InW As Workbook, OutP, InP As String
Dim i, j As Integer
Dim Darr, Arr
Application.ScreenUpdating = False
Application.DisplayAlerts = False
OutP = Cells(2, 2): InP = Cells(1, 2)
'Set OutW = Workbooks.Open(ActiveWorkbook.Path & "\" & OutP)
'Set InW = Workbooks.Open(ActiveWorkbook.Path & "\" & InP)
Set OutW = Workbooks.Open(OutP)
Set InW = Workbooks.Open(InP)
With InW.ActiveSheet
   Darr = .Range("B23:AC" & .Range("B65000").End(3).Row + 1)
End With
With OutW.Sheets("Total")
    Arr = .Range("D28:D" & .Range("D65000").End(3).Row)
    .Range("V28:V" & UBound(Arr) + 27).ClearContents
    .Range("X28:X" & UBound(Arr) + 27).ClearContents
    For i = 1 To UBound(Arr)
        For j = 1 To UBound(Darr)
            If Darr(j + 1, 1) = Arr(i, 1) Then
                .Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
                Exit For
            End If
        Next j
    Next i
End With
InW.Close False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Bạn phải nhập lại mã môn cho đúng
Mã:
Sub Copy()
Dim OutW As Workbook, InW As Workbook, OutP, InP As String
Dim i, j As Integer
Dim Darr, Arr
Application.ScreenUpdating = False
Application.DisplayAlerts = False
OutP = Cells(2, 2): InP = Cells(1, 2)
'Set OutW = Workbooks.Open(ActiveWorkbook.Path & "\" & OutP)
'Set InW = Workbooks.Open(ActiveWorkbook.Path & "\" & InP)
Set OutW = Workbooks.Open(OutP)
Set InW = Workbooks.Open(InP)
With InW.ActiveSheet
   Darr = .Range("B23:AC" & .Range("B65000").End(3).Row + 1)
End With
With OutW.Sheets("Total")
    Arr = .Range("D28:D" & .Range("D65000").End(3).Row)
    .Range("V28:V" & UBound(Arr) + 27).ClearContents
    .Range("X28:X" & UBound(Arr) + 27).ClearContents
    For i = 1 To UBound(Arr)
        For j = 1 To UBound(Darr)
            If Darr(j + 1, 1) = Arr(i, 1) Then
                .Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
                Exit For
            End If
        Next j
    Next i
End With
InW.Close False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Vâng, chân thành cám ơn bạn rất nhiều! %#^#$%#^#$
 
Upvote 0
Bạn phải nhập lại mã môn cho đúng
Mã:
Sub Copy()
Dim OutW As Workbook, InW As Workbook, OutP, InP As String
Dim i, j As Integer
Dim Darr, Arr
Application.ScreenUpdating = False
Application.DisplayAlerts = False
OutP = Cells(2, 2): InP = Cells(1, 2)
'Set OutW = Workbooks.Open(ActiveWorkbook.Path & "\" & OutP)
'Set InW = Workbooks.Open(ActiveWorkbook.Path & "\" & InP)
Set OutW = Workbooks.Open(OutP)
Set InW = Workbooks.Open(InP)
With InW.ActiveSheet
   Darr = .Range("B23:AC" & .Range("B65000").End(3).Row + 1)
End With
With OutW.Sheets("Total")
    Arr = .Range("D28:D" & .Range("D65000").End(3).Row)
    .Range("V28:V" & UBound(Arr) + 27).ClearContents
    .Range("X28:X" & UBound(Arr) + 27).ClearContents
    For i = 1 To UBound(Arr)
        For j = 1 To UBound(Darr)
            If Darr(j + 1, 1) = Arr(i, 1) Then
                .Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
                Exit For
            End If
        Next j
    Next i
End With
InW.Close False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Bạn ơi cho mình hỏi vấn đề này, Ma mon bắt buộc 2 file in và out phải giống nhau hả bạn? ví dụ Ma mon in có nhưng out ko có thì chỉ việc bỏ qua ko hay lướt qua ko đc hả bạn?
 
Upvote 0
Bạn ơi cho mình hỏi vấn đề này, Ma mon bắt buộc 2 file in và out phải giống nhau hả bạn? ví dụ Ma mon in có nhưng out ko có thì chỉ việc bỏ qua ko hay lướt qua ko đc hả bạn?
bạn dùng code mới, Mamon có hay không có ở 2 file cũng được
Mã:
Sub Copy()
Dim OutW As Workbook, InW As Workbook, OutP, InP As String
Dim i, j As Integer
Dim Darr, Arr
Application.ScreenUpdating = False
Application.DisplayAlerts = False
OutP = Cells(2, 2): InP = Cells(1, 2)
'Set OutW = Workbooks.Open(ActiveWorkbook.Path & "\" & OutP)
'Set InW = Workbooks.Open(ActiveWorkbook.Path & "\" & InP)
Set OutW = Workbooks.Open(OutP)
Set InW = Workbooks.Open(InP)
With InW.ActiveSheet
   Darr = .Range("B23:AC" & .Range("B65000").End(3).Row + 1)
End With
On Error Resume Next
With OutW.Sheets("Total")
    Arr = .Range("D28:D" & .Range("D65000").End(3).Row)
    .Range("V28:V" & UBound(Arr) + 27).ClearContents
    .Range("X28:X" & UBound(Arr) + 27).ClearContents
    For i = 1 To UBound(Arr)
        For j = 1 To UBound(Darr)
            If Darr(j + 1, 1) = Arr(i, 1) And Arr(i, 1) <> "" Then
                .Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
                Exit For
            End If
        Next j
    Next i
End With
InW.Close False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
 
Upvote 0
bạn dùng code mới, Mamon có hay không có ở 2 file cũng được
Mã:
Sub Copy()
Dim OutW As Workbook, InW As Workbook, OutP, InP As String
Dim i, j As Integer
Dim Darr, Arr
Application.ScreenUpdating = False
Application.DisplayAlerts = False
OutP = Cells(2, 2): InP = Cells(1, 2)
'Set OutW = Workbooks.Open(ActiveWorkbook.Path & "\" & OutP)
'Set InW = Workbooks.Open(ActiveWorkbook.Path & "\" & InP)
Set OutW = Workbooks.Open(OutP)
Set InW = Workbooks.Open(InP)
With InW.ActiveSheet
   Darr = .Range("B23:AC" & .Range("B65000").End(3).Row + 1)
End With
On Error Resume Next
With OutW.Sheets("Total")
    Arr = .Range("D28:D" & .Range("D65000").End(3).Row)
    .Range("V28:V" & UBound(Arr) + 27).ClearContents
    .Range("X28:X" & UBound(Arr) + 27).ClearContents
    For i = 1 To UBound(Arr)
        For j = 1 To UBound(Darr)
            If Darr(j + 1, 1) = Arr(i, 1) And Arr(i, 1) <> "" Then
                .Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
                Exit For
            End If
        Next j
    Next i
End With
InW.Close False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Chào bạn, xin lỗi lại làm phiền bạn nhưng bạn có thể hướng dẫn cách lấy dữ liệu qua mà ko làm mất dữ liệu những ô ko liên quan ko??
Mình đã bỏ 2 dòng này
.Range("V28:V" & UBound(Arr) + 27).ClearContents
.Range("X28:X" & UBound(Arr) + 27).ClearContents

Và chen thêm Else

If Darr(j + 1, 1) = Arr(i, 1) And Arr(i, 1) <> "" Then
.Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
Exit For
Else
Darr(j, 1) = Arr(i, 1)
End If

nhưng vẫn ko đc!!
 
Upvote 0
Chào bạn, xin lỗi lại làm phiền bạn nhưng bạn có thể hướng dẫn cách lấy dữ liệu qua mà ko làm mất dữ liệu những ô ko liên quan ko??
Mình đã bỏ 2 dòng này
.Range("V28:V" & UBound(Arr) + 27).ClearContents
.Range("X28:X" & UBound(Arr) + 27).ClearContents

Và chen thêm Else

If Darr(j + 1, 1) = Arr(i, 1) And Arr(i, 1) <> "" Then
.Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
Exit For
Else
Darr(j, 1) = Arr(i, 1)
End If

nhưng vẫn ko đc!!

Trong code chỉ có 2 dòng lệnh là xóa dữ liệu cột điểm
.Range("V28:V" & UBound(Arr) + 27).ClearContents
.Range("X28:X" & UBound(Arr) + 27).ClearContents
chỉ cần bỏ 2 dòng trên thì những điểm không có liên quan đến mã môn ở output không đổi, nhưng nếu bạn nhập sai mã môn, nếu có điểm cũ (không còn phù hợp) nó giữ nguyên và có thể bạn nghĩ rằng đây là điểm mới.
Bạn bỏ dòng lệnh:
Else
Darr(j, 1) = Arr(i, 1)
vì Darr(j, 1) là tên môn còn Arr(i, 1) là mã môn không liên quan nhau, thậm chí là khác môn
 
Upvote 0
Trong code chỉ có 2 dòng lệnh là xóa dữ liệu cột điểm
.Range("V28:V" & UBound(Arr) + 27).ClearContents
.Range("X28:X" & UBound(Arr) + 27).ClearContents
chỉ cần bỏ 2 dòng trên thì những điểm không có liên quan đến mã môn ở output không đổi, nhưng nếu bạn nhập sai mã môn, nếu có điểm cũ (không còn phù hợp) nó giữ nguyên và có thể bạn nghĩ rằng đây là điểm mới.
Bạn bỏ dòng lệnh:
Else
Darr(j, 1) = Arr(i, 1)
vì Darr(j, 1) là tên môn còn Arr(i, 1) là mã môn không liên quan nhau, thậm chí là khác môn

Không phải bạn ạ ví dụ như mình nhập ở Output tất cả là 2 nhưng sau khi chạy code thì những Ma mon ko có ở file Input sẽ bị mất đi, mình đã xóa 2 dòng code đó đi rồi
Capture.PNGCapture2.PNG
File đã sửa code bạn xem qua thử
 

File đính kèm

Upvote 0
Không phải bạn ạ ví dụ như mình nhập ở Output tất cả là 2 nhưng sau khi chạy code thì những Ma mon ko có ở file Input sẽ bị mất đi, mình đã xóa 2 dòng code đó đi rồi
View attachment 164898View attachment 164899
File đã sửa code bạn xem qua thử
mình tính nhầm, bạn sửa lại một chút
Mã:
Sub Copy()
Dim OutW As Workbook, InW As Workbook, OutP, InP As String
Dim i, j As Integer
Dim Darr, Arr
Application.ScreenUpdating = False
Application.DisplayAlerts = False
OutP = Cells(2, 2): InP = Cells(1, 2)
Set OutW = Workbooks.Open(OutP)
Set InW = Workbooks.Open(InP)
With InW.ActiveSheet
[COLOR=#ff0000]   Darr = .Range("B23:AC" & .Range("B65000").End(3).Row)[/COLOR]
End With
With OutW.Sheets("Total")
    Arr = .Range("D28:D" & .Range("D65000").End(3).Row)
    For i = 1 To UBound(Arr)
[COLOR=#ff0000]        For j = 1 To UBound(Darr) - 1[/COLOR]
            If Darr(j + 1, 1) = Arr(i, 1) And Arr(i, 1) <> "" Then
                .Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
                Exit For
            End If
        Next j
    Next i
End With
InW.Close False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
 
Upvote 0
mình tính nhầm, bạn sửa lại một chút
Mã:
Sub Copy()
Dim OutW As Workbook, InW As Workbook, OutP, InP As String
Dim i, j As Integer
Dim Darr, Arr
Application.ScreenUpdating = False
Application.DisplayAlerts = False
OutP = Cells(2, 2): InP = Cells(1, 2)
Set OutW = Workbooks.Open(OutP)
Set InW = Workbooks.Open(InP)
With InW.ActiveSheet
[COLOR=#ff0000]   Darr = .Range("B23:AC" & .Range("B65000").End(3).Row)[/COLOR]
End With
With OutW.Sheets("Total")
    Arr = .Range("D28:D" & .Range("D65000").End(3).Row)
    For i = 1 To UBound(Arr)
[COLOR=#ff0000]        For j = 1 To UBound(Darr) - 1[/COLOR]
            If Darr(j + 1, 1) = Arr(i, 1) And Arr(i, 1) <> "" Then
                .Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
                Exit For
            End If
        Next j
    Next i
End With
InW.Close False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Chào bạn, bạn có thể cho mình hỏi ý nghĩa đoạn code chỗ này ko?

For j = 1 To UBound(Darr) - 1
If Darr(j + 1, 1) = Arr(i, 1) And Arr(i, 1) <> "" Then

Có phải ý nó là như vầy ko? trong vòng lập j đến Darr -1 thì nếu ma mon +1 = ma mon thì sẽ lấy giá trị của điểm qua đúng ko ạ?
 
Upvote 0
Chào bạn, bạn có thể cho mình hỏi ý nghĩa đoạn code chỗ này ko?

For j = 1 To UBound(Darr) - 1
If Darr(j + 1, 1) = Arr(i, 1) And Arr(i, 1) <> "" Then

Có phải ý nó là như vầy ko? trong vòng lập j đến Darr -1 thì nếu ma mon +1 = ma mon thì sẽ lấy giá trị của điểm qua đúng ko ạ?
Vì trong Input dòng j là tên môn và điểm cần lấy và dòng thứ j+1 là mã môn, nên phải xét điều kiện dựa trên mã môn
Darr(j + 1, 1) = Arr(i, 1)
nhưng lại lấy dữ liệu trên dòng j
.Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
còn
For j = 1 To UBound(Darr) - 1
vì j+1 là tới cuối mảng Darr là UBound(Darr)
 
Upvote 0
Vì trong Input dòng j là tên môn và điểm cần lấy và dòng thứ j+1 là mã môn, nên phải xét điều kiện dựa trên mã môn
Darr(j + 1, 1) = Arr(i, 1)
nhưng lại lấy dữ liệu trên dòng j
.Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
còn
For j = 1 To UBound(Darr) - 1
vì j+1 là tới cuối mảng Darr là UBound(Darr)
Bạn ơi cho mình hỏi thêm 1 vấn đề nữa, giả sử Mamon ở file out có thêm như MH01, MH01.1, MH01.2 mình chèn thêm Left để lấy 4 giá trị là MH01
With OutW.Activesheet
Arr = Left(.Range("D28:D"), 4) & .Range("D65000").End(3).Row

Nhưng ko ra kết quả, bạn có thể xem qua giúp mình ko!!
 
Upvote 0
Bạn ơi cho mình hỏi thêm 1 vấn đề nữa, giả sử Mamon ở file out có thêm như MH01, MH01.1, MH01.2 mình chèn thêm Left để lấy 4 giá trị là MH01
With OutW.Activesheet
Arr = Left(.Range("D28:D"), 4) & .Range("D65000").End(3).Row

Nhưng ko ra kết quả, bạn có thể xem qua giúp mình ko!!
Không dùng Left cho một dãy ô được. Muốn lấy 4 ký tự bên trái bạn dùng Left từng ô
Mã:
With OutW.Sheets("Total")
    Arr = .Range("D28:D" & .Range("D65000").End(3).Row)
    For i = 1 To UBound(Arr)
        For j = 1 To UBound(Darr) - 1
            If Darr(j + 1, 1) = [COLOR=#ff0000]Left(Arr(i, 1), 4)[/COLOR] And Arr(i, 1) <> "" Then
 
Upvote 0
Tks bạn, tại mình thử trên file excel bằng hàm left thì lấy chuỗi đc, cứ nghĩ qua đây cũng vậy!!
 
Upvote 0
Không dùng Left cho một dãy ô được. Muốn lấy 4 ký tự bên trái bạn dùng Left từng ô
Mã:
With OutW.Sheets("Total")
    Arr = .Range("D28:D" & .Range("D65000").End(3).Row)
    For i = 1 To UBound(Arr)
        For j = 1 To UBound(Darr) - 1
            If Darr(j + 1, 1) = [COLOR=#ff0000]Left(Arr(i, 1), 4)[/COLOR] And Arr(i, 1) <> "" Then

Chào bạn, xin lỗi lại làm phiền bạn cho mình hỏi này cái
Giả sử file in put có một số dòng giữa tên môn và mã môn có cách nhau 1 dòng ví dụ thay vì tên môn và mã môn lần lượt là A1 và A2 nhưng cách nhau là tên sẽ ở 2 dòng A1:A2 còn mã sẽ là A3 mình đã sửa code lại như này

For i = 1 To UBound(Arr)
For j = 1 To UBound(Darr) - 1
For a = 1 To UBound(Darr) - 2
If (Darr(j + 1, 1) = Arr(i, 1)) And (Darr(a + 2, 1) = Arr(i, 1)) And (Arr(i, 1) <> "") Then
.Cells(i + 27, 22) = (Darr(j, 16)) Or (Darr(a, 16)): .Cells(i + 27, 24) = (Darr(j, 28)) Or (Darr(a, 28))
Exit For
End If
Next a
Next j
Next i

Nhưng gặp vấn đề là vi dụ ở input điểm là 8.25 nhưng khi copy sang output lại là 8.000, mất đi phần thập phân mình ko hiểu là lỗi do đâu..mong bạn giúp đỡ
Capture.jpg
 
Upvote 0
Chào bạn, xin lỗi lại làm phiền bạn cho mình hỏi này cái
Giả sử file in put có một số dòng giữa tên môn và mã môn có cách nhau 1 dòng ví dụ thay vì tên môn và mã môn lần lượt là A1 và A2 nhưng cách nhau là tên sẽ ở 2 dòng A1:A2 còn mã sẽ là A3 mình đã sửa code lại như này

For i = 1 To UBound(Arr)
For j = 1 To UBound(Darr) - 1
For a = 1 To UBound(Darr) - 2
If (Darr(j + 1, 1) = Arr(i, 1)) And (Darr(a + 2, 1) = Arr(i, 1)) And (Arr(i, 1) <> "") Then
.Cells(i + 27, 22) = (Darr(j, 16)) Or (Darr(a, 16)): .Cells(i + 27, 24) = (Darr(j, 28)) Or (Darr(a, 28))
Exit For
End If
Next a
Next j
Next i

Nhưng gặp vấn đề là vi dụ ở input điểm là 8.25 nhưng khi copy sang output lại là 8.000, mất đi phần thập phân mình ko hiểu là lỗi do đâu..mong bạn giúp đỡ
View attachment 165745
Bạn dùng code mới, hi vọng chạy đúng( vì có những ô không biết dữ liệu như thế nào)
Mã:
Sub Copy()
Dim OutW As Workbook, InW As Workbook, OutP, InP As String
Dim i, j, a As Integer
Dim Darr, Arr
Application.ScreenUpdating = False
Application.DisplayAlerts = False
OutP = Cells(2, 2): InP = Cells(1, 2)
Set OutW = Workbooks.Open(OutP)
Set InW = Workbooks.Open(InP)
With InW.ActiveSheet
   Darr = .Range("B23:AC" & .Range("B65000").End(3).Row)
End With
With OutW.ActiveSheet
    Arr = .Range("D28:D" & .Range("D65000").End(3).Row)
    For i = 1 To UBound(Arr)
        For j = 1 To UBound(Darr) - 2
            If Darr(j + 2, 1) = Arr(i, 1) And Arr(i, 1) <> "" Then
                .Cells(i + 27, 22) = Darr(j, 16) + Darr(j + 1, 16)
                .Cells(i + 27, 24) = Darr(j, 28) + Darr(j + 1, 28)
                   Exit For
            ElseIf Darr(j + 1, 1) = Arr(i, 1) And Arr(i, 1) <> "" Then
                .Cells(i + 27, 22) = Darr(j, 16): .Cells(i + 27, 24) = Darr(j, 28)
                Exit For
            End If
        Next j
    Next i
End With
InW.Close False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom