Sửa code thêm hàm bằng VBA?

Liên hệ QC

Thanh Bình PV

Thành viên hoạt động
Tham gia
30/10/19
Bài viết
151
Được thích
19
Chào Anh/Chị trong giaiphapexcel,
- Em muốn nhờ các Anh/Chị trong diễn đàn giúp sửa code VBA để thêm hàm vào nhiều ô.
- Em có tìm hiểu và viết được đoạn code để thêm hàm vào nhưng vì trình độ có hạn nên có các vấn đề sau :
1. Em sử dụng userForm để lấy vị trí ô "Code" (tìm dòng cuối của dữ liệu vì các dòng trên hay bị ngắt khoảng).
2. Em chưa tìm được cách tạo vòng lặp cho chạy tất cả các sheet (có cùng tên phía trước là "Test" số lượng khoảng 80 sheets).
3. Vì hàng bị thay đổi nên phải thay đổi "i" liên tục.
Em cảm ơn.

Mã:
Private Sub CommandButton1_Click()
    Dim i As Integer
    Dim LastRow1 As Long
If REdit1 = 0 Or REdit1 = Empty Then
    MsgBox "Please input value", , "Error"
Else
    LastRow1 = Worksheets("Test - 1").Range(REdit1).End(xlDown).Row 'tim dong cuoi
 
     Application.Interactive = False
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    
    For i = 12 To LastRow1
           'Cells(i, 3).Value = "=INDEX(Data!B:B,MATCH(B*,Data!A:A,0))"
        Cells(i, 3).Value = Application.Index(Worksheets("DATA").Range("B:B"), Application.Match(Range("B" & i), Worksheets("DATA").Range("A:A"), 0))
     Next i
    
    Application.Interactive = True
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End If
End Sub
 

File đính kèm

Chào bạn, bạn check file thử.
*Ghi chú:
1. Mình tạo vòng lặp cho toàn bộ Sheet có tên Sheet 4 ký tự đầu là Test. Nếu k thì k chạy hàm Index
2. Dòng cuối cùng mình lấy là dòng cuối của cột B.
3. Dòng đầu tiên mình lấy là dòng chứa "STT" ở cột A, nếu vùng màu vàng bạn Note không cố định mà cột A có chữ STT là code mình sai :d
4. Chúc bạn may mắn, không biết mình làm đúng yêu cầu chưa.
 

File đính kèm

Chào bạn, bạn check file thử.
*Ghi chú:
1. Mình tạo vòng lặp cho toàn bộ Sheet có tên Sheet 4 ký tự đầu là Test. Nếu k thì k chạy hàm Index
2. Dòng cuối cùng mình lấy là dòng cuối của cột B.
3. Dòng đầu tiên mình lấy là dòng chứa "STT" ở cột A, nếu vùng màu vàng bạn Note không cố định mà cột A có chữ STT là code mình sai :d
4. Chúc bạn may mắn, không biết mình làm đúng yêu cầu chưa.
Em cảm ơn ạ.
Anh có thể chỉnh giúp em 1 chút nữa được không ạ.
1. Dòng đầu tiên sẽ chính là ô mình chọn vào ( ô dưới chữ "DES" C12 hoặc 1 ô nào khác).
2. Sh.Cells(i, 3).Value : Em muốn chỉnh cột theo ô mình chọn luôn. Trường hợp ô em cho là D12 thì sẽ là Sh.Cells(i, 4).Value.
 
Em cảm ơn ạ.
Anh có thể chỉnh giúp em 1 chút nữa được không ạ.
1. Dòng đầu tiên sẽ chính là ô mình chọn vào ( ô dưới chữ "DES" C12 hoặc 1 ô nào khác).
2. Sh.Cells(i, 3).Value : Em muốn chỉnh cột theo ô mình chọn luôn. Trường hợp ô em cho là D12 thì sẽ là Sh.Cells(i, 4).Value.
Bác mà viết chọn ô thì 80 Sheet test của bác chọn hết nhá, không sử dụng vòng lặp đc
 
Ở 2 trang tính cần lấy thông tin chỉ gồm 3 cột với 3 tên trường khác nhau
Như vậy bạn muốn tìm cột nào cứ đè tên trường này ra mà tìm; 1 khi biết địa chỉ của nó thì tìm dòng cuối của nó có dữ liệu như trở bàn tay í mà!
:D Chúc vui nhân dịp xuân về!
 
Ở 2 trang tính cần lấy thông tin chỉ gồm 3 cột với 3 tên trường khác nhau
Như vậy bạn muốn tìm cột nào cứ đè tên trường này ra mà tìm; 1 khi biết địa chỉ của nó thì tìm dòng cuối của nó có dữ liệu như trở bàn tay í mà!
:D Chúc vui nhân dịp xuân về!

Em cảm ơn ạ.
Tìm dòng cuối của em thì được rồi ạ.
Nhưng anh có thể chỉnh sửa giúp em 1 vài vấn đề này được không ạ.

Em cảm ơn ạ.
Anh có thể chỉnh giúp em 1 chút nữa được không ạ.
1. Dòng đầu tiên sẽ chính là ô mình chọn vào ( ô dưới chữ "DES" C12 hoặc 1 ô nào khác).
2. Sh.Cells(i, 3).Value : Em muốn chỉnh cột theo ô mình chọn luôn. Trường hợp ô em cho là D12 thì sẽ là Sh.Cells(i, 4).Value.
 
Chào Anh/Chị trong giaiphapexcel,
- Em muốn nhờ các Anh/Chị trong diễn đàn giúp sửa code VBA để thêm hàm vào nhiều ô.
- Em có tìm hiểu và viết được đoạn code để thêm hàm vào nhưng vì trình độ có hạn nên có các vấn đề sau :
1. Em sử dụng userForm để lấy vị trí ô "Code" (tìm dòng cuối của dữ liệu vì các dòng trên hay bị ngắt khoảng).
2. Em chưa tìm được cách tạo vòng lặp cho chạy tất cả các sheet (có cùng tên phía trước là "Test" số lượng khoảng 80 sheets).
3. Vì hàng bị thay đổi nên phải thay đổi "i" liên tục.
:D 2.1. Dòng đầu tiên sẽ chính là ô mình chọn vào ( ô dưới chữ "DES" C12 hoặc 1 ô nào khác).
2.2. Sh.Cells(i, 3).Value : Em muốn chỉnh cột theo ô mình chọn luôn. Trường hợp ô em cho là D12 thì sẽ là Sh.Cells(i, 4).Value.
Bạn hãy giải thích câu 1. xem sao?
Mình hiểu là vầy: Dùng Userform để tìm địa chỉ ô có chứa từ 'Code' ở tất thẩy các trang tính có tiếp đầu lả 'TES'
Nhưng trong các trang tính ví dụ của bạn không chứa từ 'Code' mà là 'CODE'(?)
Thêm nữa, bạn nêu là các dòng dữ liệu bị ngắt quảng; nhưng trong file có ngắt quảng nào đâu(!)
Mong là bạn trình bày cho rõ, trước hết là vấn đề (1) này cái đã; Ông bà nói đầu suôi đuôi lọt là vậy!
 
Bạn hãy giải thích câu 1. xem sao?
Mình hiểu là vầy: Dùng Userform để tìm địa chỉ ô có chứa từ 'Code' ở tất thẩy các trang tính có tiếp đầu lả 'TES'
Nhưng trong các trang tính ví dụ của bạn không chứa từ 'Code' mà là 'CODE'(?)
Thêm nữa, bạn nêu là các dòng dữ liệu bị ngắt quảng; nhưng trong file có ngắt quảng nào đâu(!)
Mong là bạn trình bày cho rõ, trước hết là vấn đề (1) này cái đã; Ông bà nói đầu suôi đuôi lọt là vậy!
Đầu tiên em cảm ơn anh đã quan tâm. Em xin trình bày rõ vấn đề ạ.
1. Em viết sai từ "CODE" thành từ "code" thực chất ở đây là em dùng Userform để tìm dòng cuối của cột B.
2. Dòng dữ liệu bị ngắt quãng là như ở hàng 4,5 có dữ liệu nhưng hàng 6 thì không có dữ liệu. Và nếu em cho chạy tìm dòng cuối của cột B thì chỉ tới được hàng 5.
Không biết em trình bày chính xác chưa. Mong anh có thể giúp em ạ. Em cảm ơn.
 
Đầu tiên em cảm ơn anh đã quan tâm. Em xin trình bày rõ vấn đề ạ.
1. Em viết sai từ "CODE" thành từ "code" thực chất ở đây là em dùng Userform để tìm dòng cuối của cột B.
2. Dòng dữ liệu bị ngắt quãng là như ở hàng 4,5 có dữ liệu nhưng hàng 6 thì không có dữ liệu. Và nếu em cho chạy tìm dòng cuối của cột B thì chỉ tới được hàng 5.
Không biết em trình bày chính xác chưa. Mong anh có thể giúp em ạ. Em cảm ơn.
Thử dùng, để tìm dòng cuối
Range(...).End(xlUp)
... là ô dưới cùng ví dụ Range(B65536")
 
Lần chỉnh sửa cuối:
Thử dùng, để tìm dòng cuối
Range(...).End(xlUp)
... là ô dưới cùng ví dụ Range(B65536")
Người ta làm được rồi. Trích bài #7
Tìm dòng cuối của em thì được rồi ạ.
1. Dòng đầu tiên sẽ chính là ô mình chọn vào ( ô dưới chữ "DES" C12 hoặc 1 ô nào khác).
2. Sh.Cells(i, 3).Value : Em muốn chỉnh cột theo ô mình chọn luôn. Trường hợp ô em cho là D12 thì sẽ là Sh.Cells(i, 4).Value.
...
Vậy là không có cách nào chọn ô đó và lấy thông tin cột ạ.
Có hãy không thì hãy nghĩ thật thấu đáo, rồi mô tả kỹ cho người ta hiểu. Không hiểu thì giúp bằng niềm tin à?

Bạn nghĩ thấu đáo chưa? Tôi cho ví dụ.
Bạn viết trong Test - 1 và Test - 2
vùng không cố định có thể bị chèn thêm hàng
Nếu thế thì do chèn thêm hàng mà bạn có:
- trong Test - 1 dữ liệu có từ C12 trở xuống.
- trong Test - 2 dữ liệu có từ C15 trở xuống.

Vậy thì khi Dòng đầu tiên sẽ chính là ô mình chọn = C12 thì khi thực hiện code cho Test - 2 thì phải xử sự như thế nào? Vì trong Test - 2 thì từ dòng 12 tới 14 là "rác". Hay là trong trường hợp chỉ số dòng của "Dòng đầu tiên sẽ chính là ô mình chọn" < chỉ số của dòng đầu tiên có dữ liệu (dòng 15) thì xét từ dòng đầu tiên có dữ liệu?

Tiếp theo: dòng đầu tiên có dữ liệu được tính theo qui tắc nào? Qui tắc là: dòng ngay dưới dòng có chứa "STT" ở cột A là dòng đầu tiên có dữ liệu? Và trong cột A chỉ có 1 ô duy nhật = "STT"?

Thay vì hỏi: "Vậy là không có cách nào chọn ô đó và lấy thông tin cột ạ?" (câu hỏi phải có dấu hỏi nhé) thì hãy giải thích kỹ cho người khác hiểu.

Tôi dị ứng với những kiểu mô tả như đánh đố người khác nên ngứa tay viết dòng, bạn không nên bức xúc làm gì. Bởi tôi viết trong chủ đề này nhưng sẽ có nhiều người đọc, nên đó là lời khuyên cho rất nhiều người trong số họ.

Tôi không tham gia vào chủ đề này nữa.
 
Người ta làm được rồi. Trích bài #7


Có hãy không thì hãy nghĩ thật thấu đáo, rồi mô tả kỹ cho người ta hiểu. Không hiểu thì giúp bằng niềm tin à?

Bạn nghĩ thấu đáo chưa? Tôi cho ví dụ.
Bạn viết trong Test - 1 và Test - 2

Nếu thế thì do chèn thêm hàng mà bạn có:
- trong Test - 1 dữ liệu có từ C12 trở xuống.
- trong Test - 2 dữ liệu có từ C15 trở xuống.

Vậy thì khi Dòng đầu tiên sẽ chính là ô mình chọn = C12 thì khi thực hiện code cho Test - 2 thì phải xử sự như thế nào? Vì trong Test - 2 thì từ dòng 12 tới 14 là "rác". Hay là trong trường hợp chỉ số dòng của "Dòng đầu tiên sẽ chính là ô mình chọn" < chỉ số của dòng đầu tiên có dữ liệu (dòng 15) thì xét từ dòng đầu tiên có dữ liệu?

Tiếp theo: dòng đầu tiên có dữ liệu được tính theo qui tắc nào? Qui tắc là: dòng ngay dưới dòng có chứa "STT" ở cột A là dòng đầu tiên có dữ liệu? Và trong cột A chỉ có 1 ô duy nhật = "STT"?

Thay vì hỏi: "Vậy là không có cách nào chọn ô đó và lấy thông tin cột ạ?" (câu hỏi phải có dấu hỏi nhé) thì hãy giải thích kỹ cho người khác hiểu.

Tôi dị ứng với những kiểu mô tả như đánh đố người khác nên ngứa tay viết dòng, bạn không nên bức xúc làm gì. Bởi tôi viết trong chủ đề này nhưng sẽ có nhiều người đọc, nên đó là lời khuyên cho rất nhiều người trong số họ.

Tôi không tham gia vào chủ đề này nữa.
Đầu tiên về vấn đề chèn thêm hàng em đã không nói rõ. Tất cả các trang đều được chèn thêm hàng đều nhau. Và nếu dữ liệu từ C12 thì sẽ là C12 hết.
Về vấn đề dòng đầu tiên có dữ liệu , em cũng đã có nói ở trên và cũng đã cho ví dụ.
Em cảm ơn ạ.
Anh có thể chỉnh giúp em 1 chút nữa được không ạ.
1. Dòng đầu tiên sẽ chính là ô mình chọn vào ( ô dưới chữ "DES" C12 hoặc 1 ô nào khác).
2. Sh.Cells(i, 3).Value : Em muốn chỉnh cột theo ô mình chọn luôn. Trường hợp ô em cho là D12 thì sẽ là Sh.Cells(i, 4).Value.
Còn về câu hỏi : "Vậy là không có cách nào chọn ô đó và lấy thông tin cột ạ?" (em thiếu dấu hỏi ạ).
Thì như em đã nói trên "Sh.Cells(i, 3).Value : Em muốn chỉnh cột theo ô mình chọn luôn. Trường hợp ô em cho là D12 thì sẽ là Sh.Cells(i, 4).Value"
Em thấy là em không có đánh đố người khác về vấn đề này. Có lẽ vấn đề mô tả của em có chút sai sót em sẽ ghi nhận.

Em cảm ơn.
 
Đầu tiên về vấn đề chèn thêm hàng em đã không nói rõ. Tất cả các trang đều được chèn thêm hàng đều nhau. Và nếu dữ liệu từ C12 thì sẽ là C12 hết.
Về vấn đề dòng đầu tiên có dữ liệu , em cũng đã có nói ở trên và cũng đã cho ví dụ.

Còn về câu hỏi : "Vậy là không có cách nào chọn ô đó và lấy thông tin cột ạ?" (em thiếu dấu hỏi ạ).
Thì như em đã nói trên "Sh.Cells(i, 3).Value : Em muốn chỉnh cột theo ô mình chọn luôn. Trường hợp ô em cho là D12 thì sẽ là Sh.Cells(i, 4).Value"
Em thấy là em không có đánh đố người khác về vấn đề này. Có lẽ vấn đề mô tả của em có chút sai sót em sẽ ghi nhận.

Em cảm ơn.
Vậy thử mô tả rõ lại từ đầu, vấn đề nào tồn vấn đề nào đã giải quyết đến thời điểm này.
 
Đầu tiên về vấn đề chèn thêm hàng em đã không nói rõ. Tất cả các trang đều được chèn thêm hàng đều nhau. Và nếu dữ liệu từ C12 thì sẽ là C12 hết.
...
Em thấy là em không có đánh đố người khác về vấn đề này. Có lẽ vấn đề mô tả của em có chút sai sót em sẽ ghi nhận.
Thôi được, nếu bạn cho rằng bạn đã suy nghĩ thấu đáo, đã viết rõ hết ý thì tôi làm 1 lần y như ý bạn. Sẽ không có "À quên, em nhầm chỗ này, chỗ kia em có chút sai sót."

Mã:
Sub Test()
Dim k As Long, startRow As Long, firstRow As Long, lastRow As Long, col As Long
Dim cell_ As Range, rng As Range, sh As Worksheet
    Set wb = ThisWorkbook
    On Error Resume Next
    Set rng = Application.InputBox("Hay chon o dau tien, tu cot C tro di.", "Chon o dau tien", Type:=8)
    On Error GoTo 0
    If rng Is Nothing Then Exit Sub
    startRow = rng(1).Row
    col = rng(1).Column
    If rng(1).Column < 3 Then
        MsgBox "Chi duoc phep chon tu cot C tro di"
        Exit Sub
    End If
    For Each sh In ThisWorkbook.Worksheets
        If InStr(1, sh.Name, "Test", vbTextCompare) = 1 Then
            If firstRow = 0 Then
                Set cell_ = sh.Range("B1:B100000").Find("code", sh.Range("B1"), xlValues, xlWhole, xlByColumns, xlNext)
                If cell_ Is Nothing Then Exit Sub
                firstRow = cell_.Row + 1
                If startRow < firstRow Then startRow = firstRow
            End If
            lastRow = sh.Range("B" & Rows.Count).End(xlUp).Row
            For k = startRow To lastRow
                If Not IsEmpty(sh.Range("B" & k)) Then
                    sh.Cells(k, col).Value = Application.Index(ThisWorkbook.Worksheets("Data").Range("A1:A100000").Offset(0, col - 2), _
                    Application.Match(sh.Range("B" & k), ThisWorkbook.Worksheets("Data").Range("A1:A100000"), 0))
                End If
            Next k
        End If
    Next
End Sub
 
Thôi được, nếu bạn cho rằng bạn đã suy nghĩ thấu đáo, đã viết rõ hết ý thì tôi làm 1 lần y như ý bạn. Sẽ không có "À quên, em nhầm chỗ này, chỗ kia em có chút sai sót."
Em cảm ơn anh. Em vẫn còn sai sót và chưa mô tả rõ ý của mình, em sẽ rút kinh nghiệm và mô tả chi tiết nhất nếu có bài viết mới ạ.
 
Web KT

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

Back
Top Bottom