Sửa giúp code vba để Merge và kẻ khung (1 người xem)

Liên hệ QC

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

Thuyanhanoi

Thành viên thường trực
Tham gia
15/10/12
Bài viết
304
Được thích
154
Nghề nghiệp
Nhân viên
Mình có một đoạn code để lấy dữ liệu một vùng bảng tính bên sheet(DaTa) sang sheet Mau.
Hiện code của mình đã lấy được dữ liệu. Nhưng mình muốn trong code phải Merge và kẻ khung viền(Như sheet Mau mình đã làm) trong file đính kèm.
Mong các bạn sửa giúp mình để code thực hiện được thêm những điều mình đã nói ở trên.
Mã:
Public Sub Mau_TH()
    Dim i As Long, J As Long, sArr(), dArr(), K As Long, STT As Long
    With Sheets("DaTa")
        sArr = .Range("B12:AO69").Value
    End With
    ReDim dArr(1 To UBound(sArr, 1), 1 To 40)
    For i = 1 To UBound(sArr, 1) Step 2
      'If sArr(i, 2) <> "" Then
        K = K + 1: STT = STT + 1
        dArr(K, 1) = STT
        For J = 2 To 10 ' 38
            dArr(K, J) = sArr(i, J)
            dArr(K + 1, J) = sArr(i + 1, J)
        Next J
            dArr(K, 11) = "AH"
            dArr(K + 1, 11) = "BM"
        For J = 12 To 38
            dArr(K, J) = sArr(i, J)
            dArr(K + 1, J) = sArr(i + 1, J)
        Next J
        If sArr(i, 40) > 0 Then
        dArr(K, 39) = sArr(i, 40)
        End If
      'End If
      K = K + 1
    Next i
    With Sheets("Mau")
        .[A12:AN200].ClearContents
        .[A12].Resize(K, 40).Value = dArr
        .[A12].Resize(K, 38).Borders.LineStyle = xlContinuous
        .[A12].Resize(K, 38).Borders(xlInsideHorizontal).Weight = xlHairline
        .[G12:J200,L12:AL200].ClearContents
        .[A12].Resize(K + 20, 50).Locked = False
        .[A12].Resize(K, 7).Locked = True
        .[AL12].Resize(K, 2).Locked = True
        .[K12].Resize(K, 1).Locked = True
        'ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="123"
    End With
End Sub
Xin cảm ơn các bạn đã giúp mình!.
 

File đính kèm

Lần chỉnh sửa cuối:
Mã:
Public Sub Mau_TH()
Application.ScreenUpdating = False
'....
        .[K12].Resize(K, 1).Locked = True
        Dim c As Byte
        For c = 1 To 4
            Mege .Range("A12").Offset(0, c - 1).Resize(K, 1)
        Next c
        Mege .Range("H12").Resize(K, 1)
        'ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="123"
    End With
Application.ScreenUpdating = True
End Sub
'------------
Sub Mege(rng As Range)
Dim r As Long
If rng.Columns.Count > 1 Then Exit Sub
For r = 1 To rng.Rows.Count Step 2
    rng.Cells(r, 1).Resize(2, 1).MergeCells = True
Next r
End Sub
 
Upvote 0
Cảm ơn Bạn đã giúp mình!.
- Mình làm theo bạn hướng dẫn thì phát sinh như sau:
Mã:
Public Sub Mau_TH()
Application.ScreenUpdating = False
    Dim i As Long, J As Long, sArr(), dArr(), K As Long, STT As Long
    With Sheets("DaTa")
        sArr = .Range("B12:AO69").Value
    End With
    ReDim dArr(1 To UBound(sArr, 1), 1 To 40)
    For i = 1 To UBound(sArr, 1) Step 2
      'If sArr(i, 2) <> "" Then
        K = K + 1: STT = STT + 1
        dArr(K, 1) = STT
        For J = 2 To 10 ' 38
            dArr(K, J) = sArr(i, J)
            dArr(K + 1, J) = sArr(i + 1, J)
        Next J
            dArr(K, 11) = "AH"
            dArr(K + 1, 11) = "BM"
        For J = 12 To 38
            dArr(K, J) = sArr(i, J)
            dArr(K + 1, J) = sArr(i + 1, J)
        Next J
        If sArr(i, 40) > 0 Then
        dArr(K, 39) = sArr(i, 40)
        End If
      'End If
      K = K + 1
    Next i
    With Sheets("Mau")
        .[A12:AN200].ClearContents
        .[A12].Resize(K, 40).Value = dArr
        .[A12].Resize(K, 38).Borders.LineStyle = xlContinuous
        '.[A12].Resize(K, 38).Borders(xlInsideHorizontal).Weight = xlHairline
        .[G12:J200,L12:AL200].ClearContents
        .[A12].Resize(K + 20, 50).Locked = False
        .[A12].Resize(K, 7).Locked = True
        .[AL12].Resize(K, 2).Locked = True
        .[K12].Resize(K, 1).Locked = True
        .[K12].Resize(K, 1).Locked = True
        Dim c As Byte
        For c = 1 To 4
            Mege .Range("A12").Offset(0, c - 1).Resize(K, 1)
        Next c
        Mege .Range("H12").Resize(K, 1)
        'ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="123"
    End With
    Application.ScreenUpdating = True
End Sub


'------------
Sub Mege(rng As Range)
Dim r As Long
If rng.Columns.Count > 1 Then Exit Sub
For r = 1 To rng.Rows.Count Step 2
    rng.Cells(r, 1).Resize(2, 1).MergeCells = True
Next r
End Sub

- Trên Sheet(DaTa) vùng dữ liệu từ cột [H] đến cột [AM] nếu có dữ liệu thì khi chạy code thì không lấy sang được Sheet(Mau): Xin lỗi mình nhầm ý này! (.[G12:J200,L12:AL200].ClearContents)
- Bạn giúp thêm mình một chút nữa là: Giữa 2 dòng có Merge thì kẻ đường mờ "xlHairline" ở giữa với các cột còn lại không Merge

Mình cảm ơn bạn nhiều!.
Mã:
Public Sub Mau_TH()
Application.ScreenUpdating = False
'....
        .[K12].Resize(K, 1).Locked = True
        Dim c As Byte
        For c = 1 To 4
            Mege .Range("A12").Offset(0, c - 1).Resize(K, 1)
        Next c
        Mege .Range("H12").Resize(K, 1)
        'ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="123"
    End With
Application.ScreenUpdating = True
End Sub
'------------
Sub Mege(rng As Range)
Dim r As Long
If rng.Columns.Count > 1 Then Exit Sub
For r = 1 To rng.Rows.Count Step 2
    rng.Cells(r, 1).Resize(2, 1).MergeCells = True
Next r
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Giữa 2 dòng có Merge thì kẻ đường mờ "xlHairline" ở giữa với các cột còn lại không Merge
Chèn vào dòng '.[A12].Resize(K, 38).Borders(xlInsideHorizontal).Weight = xlHairline
Mã:
Dim r As Long
For r = 1 To K Step 2
    .[A11].Offset(r, 0).Resize(2, 38).Borders(xlInsideHorizontal).Weight = xlHairline
Next r
Chuyển Dim r và Dim c lên trên đầu
 
Upvote 0
Cảm ơn bạn nhiều!.
- Mình làm theo hương dẫn của bạn thì đã kẻ được khung như ý. Nhưng lại say ra tình huống như sau mong bạn giúp mình với!.
- Lúc trước trong code mình tắt đi dòng này:
Mã:
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="123"
Nay mình để cho dòng code đó hoạt động thì ở cột [H] Sheet(Mau) mặc dù mình đã để ở chế độ Locked = False nhưng sao nó không được
Mục đích của mình là các cột Từ [A:E] của sheet(Mau) được Locked để khỏi vô tình làm ảnh hưởng tới dữ liệu; Cột [H] của sheet(Mau) code marge mình không muốn Locked vì để nhập dữ liệu vào.
Mong bạn và mọi người xem giúp mình với nhé!. Mình cảm ơn mọi sự giúp đỡ!.
Chèn vào dòng '.[A12].Resize(K, 38).Borders(xlInsideHorizontal).Weight = xlHairline
Mã:
Dim r As Long
For r = 1 To K Step 2
    .[A11].Offset(r, 0).Resize(2, 38).Borders(xlInsideHorizontal).Weight = xlHairline
Next r
Chuyển Dim r và Dim c lên trên đầu
 
Upvote 0
Mã:
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="123"
Nay mình để cho dòng code đó hoạt động thì ở cột [H] Sheet(Mau) mặc dù mình đã để ở chế độ Locked = False nhưng sao nó không được
Thêm dòng:
ActiveSheet.Unprotect Password:="123"
trước dòng:
With Sheets("Mau")
 
Upvote 0
VBA và Merged cells là lửa và dầu.
Hai cái này vọc cùng 1 lúc thì thế nào cũng có lúc bỏng.
 
Upvote 0
Thêm dòng:
ActiveSheet.Unprotect Password:="123"
trước dòng:
With Sheets("Mau")
Mình làm theo bạn!.
Mã:
Public Sub Mau_TH()
Application.ScreenUpdating = False
    Dim i As Long, J As Long, sArr(), dArr(), K As Long, STT As Long
    Dim r As Long, c As Byte
    With Sheets("DaTa")
        sArr = .Range("B12:AO69").Value
    End With
    ReDim dArr(1 To UBound(sArr, 1), 1 To 40)
    For i = 1 To UBound(sArr, 1) Step 2
      'If sArr(i, 2) <> "" Then
        K = K + 1: STT = STT + 1
        dArr(K, 1) = STT
        For J = 2 To 10 ' 38
            dArr(K, J) = sArr(i, J)
            dArr(K + 1, J) = sArr(i + 1, J)
        Next J
            dArr(K, 11) = "AH"
            dArr(K + 1, 11) = "BM"
        For J = 12 To 38
            dArr(K, J) = sArr(i, J)
            dArr(K + 1, J) = sArr(i + 1, J)
        Next J
        If sArr(i, 40) > 0 Then
        dArr(K, 39) = sArr(i, 40)
        End If
      'End If
      K = K + 1
    Next i
    ActiveSheet.Unprotect Password:="123"
    With Sheets("Mau")
        .[A12:AN200].ClearContents
        .[A12].Resize(K, 40).Value = dArr
        .[A12].Resize(K, 38).Borders.LineStyle = xlContinuous
        For r = 1 To K Step 2
            .[A11].Offset(r, 0).Resize(2, 38).Borders(xlInsideHorizontal).Weight = xlHairline
        Next r
        .[G12:J200,L12:AL200].ClearContents
        .[A12].Resize(K + 20, 50).Locked = False
        .[A12].Resize(K, 7).Locked = True
        .[AL12].Resize(K, 2).Locked = True
        .[K12].Resize(K, 1).Locked = True
        .[K12].Resize(K, 1).Locked = True
        For c = 1 To 4
            Mege .Range("A12").Offset(0, c - 1).Resize(K, 1)
        Next c
        Mege .Range("H12").Resize(K, 1)
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="123"
    End With
    Application.ScreenUpdating = True
End Sub
Nhưng sao cột [H] Sheet(Mau) vẫn bị Locked không nhập được dữ liệu, bạn xem giùm mình với!.
 
Upvote 0
VBA và Merged cells là lửa và dầu.
Hai cái này vọc cùng 1 lúc thì thế nào cũng có lúc bỏng.
Vâng
Em cũng chỉ mong sao đừng vo tình làm thay đổi dữ liệu khi xuất sang sheet mẫu thôi.
"Người được em gửi mẫu để nhập lại cứ bắt phải Merge" những chỗ đó lại
Mong anh khắc phục giúp!.
 
Lần chỉnh sửa cuối:
Upvote 0
"H12:H" & K + 20 thì nhập dữ liệu bình thường, ngoài vùng này không nhập được.
Bạn xem file giúp mình với!, mình đã tet nhiều lần mà "H12:H" vẫn không nhập được, không biết là còn thao tác gì mình chưa làm đúng
 

File đính kèm

Upvote 0
Vâng
Em cũng chỉ mong sao đừng vo tình làm thay đổi dữ liệu khi xuất sang sheet mẫu thôi.
"Người được em gửi mẫu để nhập lại cứ bắt phải Merge" những chỗ đó lại
Mong anh khắc phục giúp!.

Bạn nói thẳng với người đòi merge này rằng chuyên viên (*) về dữ liệu và lập trình nói "đã merge thì đừng VBA, đã VBA thì đừng merge"
Nếu ngừoi này là sếp bạn thì xin lỗi, bạn gặp người sếp cứng đầu.

(*) tôi làm việc với bảng tính trải rộng từ hồi nó còn là con đẻ của Lotus 123. Thiết nghĩ tôi tự xưng mình là chuyên viên dữ liệu không quá đáng đâu.
 
Upvote 0
Bạn nói thẳng với người đòi merge này rằng chuyên viên (*) về dữ liệu và lập trình nói "đã merge thì đừng VBA, đã VBA thì đừng merge"
Nếu ngừoi này là sếp bạn thì xin lỗi, bạn gặp người sếp cứng đầu.

(*) tôi làm việc với bảng tính trải rộng từ hồi nó còn là con đẻ của Lotus 123. Thiết nghĩ tôi tự xưng mình là chuyên viên dữ liệu không quá đáng đâu.
- Vâng em sẽ lựa lời ạ!.
- Qua bài mình xin cảm ơn bạn befaint đã nhiệt tình giúp mình!. Mình đã tìm được cách khắc phục rồi!.
Sau dòng
Mã:
  Mege .Range("H12").Resize(K, 1)
thì chèn thêm dòng này
Mã:
 .Range("H12").Resize(K, 1).Locked = False
 
Upvote 0
Bạn xem file giúp mình với!, mình đã tet nhiều lần mà "H12:H" vẫn không nhập được, không biết là còn thao tác gì mình chưa làm đúng

Mã:
'...
    Next i
    With Sheets("Mau")
        .Unprotect Password:="123"
        .[A12:AN200].UnMerge
        .[A12:AN200].Borders.LineStyle = 0  [COLOR=#0000ff]'Thêm dòng này[/COLOR]
        .[A12:AN200].ClearContents
        .[A12].Resize(K, 40).Value = dArr
        .[A12].Resize(K, 38).Borders.LineStyle = xlContinuous
        For r = 1 To K Step 2
            .[A11].Offset(r, 0).Resize(2, 38).Borders(xlInsideHorizontal).Weight = xlHairline
        Next r
        .[G12:J200,L12:AL200].ClearContents
        For c = 1 To 4
            Mege .Range("A12").Offset(0, c - 1).Resize(K, 1)
        Next c
        Mege .Range("H12").Resize(K, 1)
        .[A12].Resize(K + 20, 50).Locked = False
        .[A12].Resize(K, 7).Locked = True
        .[AL12].Resize(K, 2).Locked = True
        .[K12].Resize(K, 1).Locked = True
        .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="123"
        .EnableSelection = xlUnlockedCells
    End With
    Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom