Tìm đến một dòng có các ký tự(abcd...vv) và thêm vào trên nó một dòng có các ký tự(efgh...vv).

Liên hệ QC

vuthuaphong

Thành viên mới
Tham gia
12/8/09
Bài viết
11
Được thích
1
Như tiêu đề, em đang cần một đoạn code như thế. Cụ thể là file của em chứa các dòng ký tự có thứ tự lặp lại, em đang muốn tìm đến dòng có ký tự(vd: abc...vv) sau đó thêm vào trên dòng đó 1 dòng có các ký tự(vd: efg...vv). Tại file của em có số dòng lặp lại rất nhiều ạ. Cảm ơn các cao nhân đi qua xem giúp và giúp đỡ.
 
Như tiêu đề, em đang cần một đoạn code như thế. Cụ thể là file của em chứa các dòng ký tự có thứ tự lặp lại, em đang muốn tìm đến dòng có ký tự(vd: abc...vv) sau đó thêm vào trên dòng đó 1 dòng có các ký tự(vd: efg...vv). Tại file của em có số dòng lặp lại rất nhiều ạ. Cảm ơn các cao nhân đi qua xem giúp và giúp đỡ.
Bạn có thể dùng CH+H rồi thay thế theo ý bạn cũng được.
 
Upvote 0
Bạn có thể dùng CH+H rồi thay thế theo ý bạn cũng được.
Em không hiểu ý bác lắm nhưng file của e nó có số dòng lặp rất nhiều, em đang muốn tìm code để nó tự tìm đến dòng cần tìm rồi thêm 1 dòng vào nữa. Chứ em mà ngồi Find and replace chắc tới sang năm.
 
Upvote 0
Thêm chuỗi đó vào chuỗi của cell phía trên hay là thêm dòng rồi ghi chuỗi đó vào cell phía trên? => Tốt nhất là làm vài kết quả mẫu rồi gửi lên.

View attachment 257566

65536 tịt ngỏm rồi, thêm dòng thì thua luôn.
Thêm dòng rồi ghi chuỗi đó vào cell phía trên á bác.

Chưa có tên.png
Bài đã được tự động gộp:

Thêm dòng rồi ghi chuỗi đó vào cell phía trên á bác.

Chưa có tên.png
À em quên các bác à. Tại e save vội ra excel 2003 thôi nên nó hạn chế số dòng còn bao nhiêu đó. Chứ cái file của em không nhất thiết phải save ở excel 2003. các bác giúp em làm sao tìm và thêm dòng là được Em có thể cắt dữ liệu trong file sao cho phù hợp để chèn.
 
Upvote 0
PHP:
Option Explicit

Sub AddRowString()
    Const rngData = "A1:A1000"
    Const strFind = "LIGHT/DIA,0.70"
    Const strAdd = "LIGHT/EPI,0.24"
    Const sCellTarget = "B1"
    Dim data As Variant, i As Long, endRow As Long
    Dim result As Variant, ii As Long
    Dim ws As Worksheet
    Set ws = Sheet1
    data = ws.Range(rngData).Value
    endRow = UBound(data, 1)
    ReDim result(1 To endRow * 2, 1 To 1)
    For i = 1 To endRow
        ii = ii + 1
        result(ii, 1) = data(i, 1)
        If data(i, 1) = strFind Then
            result(ii, 1) = strAdd
            ii = ii + 1
            result(ii, 1) = strFind
        End If
    Next i
    ws.Range(sCellTarget).EntireColumn.ClearContents
    ws.Range(sCellTarget).Resize(ii, 1).Value = result
    Erase data, result
    Set ws = Nothing
End Sub
 
Upvote 0
PHP:
Option Explicit

Sub AddRowString()
    Const rngData = "A1:A1000"
    Const strFind = "LIGHT/DIA,0.70"
    Const strAdd = "LIGHT/EPI,0.24"
    Const sCellTarget = "B1"
    Dim data As Variant, i As Long, endRow As Long
    Dim result As Variant, ii As Long
    Dim ws As Worksheet
    Set ws = Sheet1
    data = ws.Range(rngData).Value
    endRow = UBound(data, 1)
    ReDim result(1 To endRow * 2, 1 To 1)
    For i = 1 To endRow
        ii = ii + 1
        result(ii, 1) = data(i, 1)
        If data(i, 1) = strFind Then
            result(ii, 1) = strAdd
            ii = ii + 1
            result(ii, 1) = strFind
        End If
    Next i
    ws.Range(sCellTarget).EntireColumn.ClearContents
    ws.Range(sCellTarget).Resize(ii, 1).Value = result
    Erase data, result
    Set ws = Nothing
End Sub
Cảm ơn bác rất nhiều.
 
Upvote 0
PHP:
Option Explicit

Sub AddRowString()
    Const rngData = "A1:A1000"
    Const strFind = "LIGHT/DIA,0.70"
    Const strAdd = "LIGHT/EPI,0.24"
    Const sCellTarget = "B1"
    Dim data As Variant, i As Long, endRow As Long
    Dim result As Variant, ii As Long
    Dim ws As Worksheet
    Set ws = Sheet1
    data = ws.Range(rngData).Value
    endRow = UBound(data, 1)
    ReDim result(1 To endRow * 2, 1 To 1)
    For i = 1 To endRow
        ii = ii + 1
        result(ii, 1) = data(i, 1)
        If data(i, 1) = strFind Then
            result(ii, 1) = strAdd
            ii = ii + 1
            result(ii, 1) = strFind
        End If
    Next i
    ws.Range(sCellTarget).EntireColumn.ClearContents
    ws.Range(sCellTarget).Resize(ii, 1).Value = result
    Erase data, result
    Set ws = Nothing
End Sub
Thầy cho em hỏi với, đoạn set ws = Nothing ở cuối mục đích để làm gì thầy?
 
Upvote 0
Câu trước nó, Erase ... mới là giải phóng bộ nhớ.
ws chỉ là con trỏ chiếu vào Sheet1. Khi set ws = nothing thì VBA chỉ tách rời ws khỏi Sheet1. Sheet ấy lúc nào nó cũng nằm đó, đâu có mất đi mà giải phóng.
Em cũng không rành chỗ này bác. Vậy nó làm nhiệm vụ gì và nếu không có câu lệnh ấy thì sao mà thấy ai cũng viết như vậy?
 
Upvote 0
Em cũng không rành chỗ này bác. Vậy nó làm nhiệm vụ gì và nếu không có câu lệnh ấy thì sao mà thấy ai cũng viết như vậy?
ws được khai báo kiểu Worksheet, tức là một loại Object.

Trong workbook có một mớ đối tượng dạng worksheet. Sheet1 được mặc định là biến trỏ vào sheet đầu tiên (tạm gọi ở đây là 'sheet-1')
Set ws = Sheet1
là trỏ thêm ws vào đối tượng 'sheet-1'. Tức là cả ws và Sheet1 đều trỏ vào 'sheet-1'.

Nothing trong VBA là một tình trạng "không xác định".
Set ws = Nothing tức à đưa nó về tình trạng không xác định (có thể coi như là không trỏ vào cái gì cả).

Công dụng:
Hệ thống dọn rác trong VBA có nhiệm vụ dọn và lấy lại bộ nhớ trước đó được chiếm hữu bởi những biến và bây giờ không sử dụng nữa.
VBA mặc định rằng nếu đối tượng nào không còn con trỏ nào trỏ vào thì coi như nó không còn sử dụng. Và VBA sẽ dọn nó, lấy lại bộ nhớ.
Việc dọn rác này khá quan trọng với các đối tượng được dựng lên do lệnh New, hàm CreateObject,...
Set x = CreateObject("object gì đó") là lệnh dựng lên một đối tượng "object gì đó" và trỏ biến x vào.
Set y = x là lệnh trỏ y vào cùng đối tượng với x.
Set x = Nothing tách x ra khỏi cái "object gì đó" ở trên.
Tuy nhiên bộ phận dọn rác vẫn chưa giải phóng "object gì đó" là bởi vì VBA biết y vẫn còn trỏ vào đấy.
Set y = Notinhg tách y ra khỏi "object gì đó".
Bây giờ thì không còn gì trỏ vào, "object gì đó" sẽ được VBA giải phóng.

Công dụng thứ nhất:
Giải phóng đối tượng. Như giải thích trên.

Công dụng thứ hai:
Tách biến ra khỏi đối tượng. Như ở bài #9.
Trong bài #9, biến ws là biến nội. Khi End Sub thì biến nội tự động bị diệt, và ws không còn tồn tại để trỏ vào Sheet1 nữa. Vì vậy, trên hiện tại ở bài #9, lệnh Set ws = Nothing không quan trọng lắm.
Tuy nhiên, đối với một người viết code chia ra nhiều sub's và function's thì Set biến = Nothing khi không cần nó nữa là một thói quen tốt.
1. code dễ copy paste từ đoạn này sang đoạn khác, từ sub/function này sang sub/function khác.
2. nếu ws là biến toàn cục thì việc Set nó về Nothing sau khi sử dụng là việc cần thiết để tránh rắc rối sau này.
 
Upvote 0
ws được khai báo kiểu Worksheet, tức là một loại Object.

Trong workbook có một mớ đối tượng dạng worksheet. Sheet1 được mặc định là biến trỏ vào sheet đầu tiên (tạm gọi ở đây là 'sheet-1')
Set ws = Sheet1
là trỏ thêm ws vào đối tượng 'sheet-1'. Tức là cả ws và Sheet1 đều trỏ vào 'sheet-1'.

Nothing trong VBA là một tình trạng "không xác định".
Set ws = Nothing tức à đưa nó về tình trạng không xác định (có thể coi như là không trỏ vào cái gì cả).

Công dụng:
Hệ thống dọn rác trong VBA có nhiệm vụ dọn và lấy lại bộ nhớ trước đó được chiếm hữu bởi những biến và bây giờ không sử dụng nữa.
VBA mặc định rằng nếu đối tượng nào không còn con trỏ nào trỏ vào thì coi như nó không còn sử dụng. Và VBA sẽ dọn nó, lấy lại bộ nhớ.
Việc dọn rác này khá quan trọng với các đối tượng được dựng lên do lệnh New, hàm CreateObject,...
Set x = CreateObject("object gì đó") là lệnh dựng lên một đối tượng "object gì đó" và trỏ biến x vào.
Set y = x là lệnh trỏ y vào cùng đối tượng với x.
Set x = Nothing tách x ra khỏi cái "object gì đó" ở trên.
Tuy nhiên bộ phận dọn rác vẫn chưa giải phóng "object gì đó" là bởi vì VBA biết y vẫn còn trỏ vào đấy.
Set y = Notinhg tách y ra khỏi "object gì đó".
Bây giờ thì không còn gì trỏ vào, "object gì đó" sẽ được VBA giải phóng.

Công dụng thứ nhất:
Giải phóng đối tượng. Như giải thích trên.

Công dụng thứ hai:
Tách biến ra khỏi đối tượng. Như ở bài #9.
Trong bài #9, biến ws là biến nội. Khi End Sub thì biến nội tự động bị diệt, và ws không còn tồn tại để trỏ vào Sheet1 nữa. Vì vậy, trên hiện tại ở bài #9, lệnh Set ws = Nothing không quan trọng lắm.
Tuy nhiên, đối với một người viết code chia ra nhiều sub's và function's thì Set biến = Nothing khi không cần nó nữa là một thói quen tốt.
1. code dễ copy paste từ đoạn này sang đoạn khác, từ sub/function này sang sub/function khác.
2. nếu ws là biến toàn cục thì việc Set nó về Nothing sau khi sử dụng là việc cần thiết để tránh rắc rối sau này.
Em hiểu rồi: "Tuy nhiên, đối với một người viết code chia ra nhiều sub's và function's thì Set biến = Nothing khi không cần nó nữa là một thói quen tốt.".
Nhưng như bác nói, câu lệnh đó vẫn là thông báo cho VBA "giải phóng bộ nhớ có điều kiện" phải không bác: "
Hệ thống dọn rác trong VBA có nhiệm vụ dọn và lấy lại bộ nhớ trước đó được chiếm hữu bởi những biến và bây giờ không sử dụng nữa.
VBA mặc định rằng nếu đối tượng nào không còn con trỏ nào trỏ vào thì coi như nó không còn sử dụng. Và VBA sẽ dọn nó, lấy lại bộ nhớ.
Việc dọn rác này khá quan trọng với các đối tượng được dựng lên do lệnh New, hàm CreateObject,...
Set x = CreateObject("object gì đó") là lệnh dựng lên một đối tượng "object gì đó" và trỏ biến x vào.
Set y = x là lệnh trỏ y vào cùng đối tượng với x.
Set x = Nothing tách x ra khỏi cái "object gì đó" ở trên.
Tuy nhiên bộ phận dọn rác vẫn chưa giải phóng "object gì đó" là bởi vì VBA biết y vẫn còn trỏ vào đấy.
Set y = Notinhg tách y ra khỏi "object gì đó".
Bây giờ thì không còn gì trỏ vào, "object gì đó" sẽ được VBA giải phóng.
"

???
 
Lần chỉnh sửa cuối:
Upvote 0
Em hiểu rồi. Nhưng như bác nói, câu lệnh đó vẫn như là thông báo cho VBA giải phóng bộ nhớ phải không bác: "Hệ thống dọn rác trong VBA có nhiệm vụ dọn và lấy lại bộ nhớ trước đó được chiếm hữu bởi những biến và bây giờ không sử dụng nữa. VBA mặc định rằng nếu đối tượng nào không còn con trỏ nào trỏ vào thì coi như nó không còn sử dụng. Và VBA sẽ dọn nó, lấy lại bộ nhớ." ???
Ở vài #9, ws không trỏ vào một đối tượng do VBA dựng lên. Nó trỏ vào một sheet, tức là một đối tượng của Excel. Đối tượng này luôn tồn tại (trừ phi VBA xoá nó đi bằng Sheet.Delete). Vì vậy, bạn Set ws = Nothing đâu có giải phóng bộ nhớ của Sheet1.

Nếu bạn có:
Set dic = CreateObject("Scripting.Dictionary")
thì VBA sẽ dựng lên một đối tượng kiểu dictionary cho bạn làm việc (qua con trỏ dic). Khi không cần nữa thì
Set dic = Nothing
Vì không còn gì trỏ vào cái đối tượng dictionary kia cho nên nó thành vô chủ. Khi ấy, VBA sẽ huỷ đối tượng và thu hồi bộ nhớ.
 
Upvote 0
Web KT

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

Back
Top Bottom