Chuyên mục xử lý, gỡ rối code VBA (2 người xem)

Liên hệ QC

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

Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,957
[GPECODE=vb]Option ExplicitSub CopyCongSP()
Dim lRs As Long
lRs = LDQuanLy.[A65500].End(xlUp).Row - 10
ActiveSheet.Cells(11, 1).FormulaR1C1 = "=IF(RC9<>"""",RC[93],"""")"
ActiveSheet.Cells(11, 1).AutoFill Cells(11, 1).Resize(lRs)
ActiveSheet.Cells(11, 2).FormulaR1C1 = "=IF(RC9<>"""",RC[32],"""")"
ActiveSheet.Cells(11, 2).AutoFill Cells(11, 2).Resize(lRs)
ActiveSheet.Cells(11, 3).FormulaR1C1 = "=IF(AND(RC9<>"""",RC[63]<>""""),RC[63],"""")"
ActiveSheet.Cells(11, 3).AutoFill Cells(11, 3).Resize(lRs)
End Sub[/GPECODE]

Với đoạn code như trên thì cho em hỏi có cách nào để viết cho nó ngắn gon hơn nữa không?
Nhờ các anh chị giúp đỡ.
Trân trọng
Thử xem có đúng ý bạn không nhé!

Mã:
Sub CopyCongSP()
    Dim lRs As Long
[COLOR=#ff0000]    lRs = LDQuanLy.Range("A" & Rows.Count).End(xlUp).Row[/COLOR]
    With ActiveSheet
        .Cells(11, 1).FormulaR1C1 = "=IF(RC9<>"""",RC[93],"""")"
        .Cells(11, 2).FormulaR1C1 = "=IF(RC9<>"""",RC[32],"""")"
        .Cells(11, 3).FormulaR1C1 = "=IF(AND(RC9<>"""",RC[63]<>""""),RC[63],"""")"
[COLOR=#ff0000]        Range(.Cells(11, 1), .Cells(11, 3)).AutoFill Range(.Cells(11, 1), .Cells(lRs, 3))[/COLOR]
    End With
End Sub
 
Upvote 0
Thử xem có đúng ý bạn không nhé!

Mã:
Sub CopyCongSP()
    Dim lRs As Long
[COLOR=#ff0000]    lRs = LDQuanLy.Range("A" & Rows.Count).End(xlUp).Row[/COLOR]
    With ActiveSheet
        .Cells(11, 1).FormulaR1C1 = "=IF(RC9<>"""",RC[93],"""")"
        .Cells(11, 2).FormulaR1C1 = "=IF(RC9<>"""",RC[32],"""")"
        .Cells(11, 3).FormulaR1C1 = "=IF(AND(RC9<>"""",RC[63]<>""""),RC[63],"""")"
[COLOR=#ff0000]        Range(.Cells(11, 1), .Cells(11, 3)).AutoFill Range(.Cells(11, 1), .Cells(lRs, 3))[/COLOR]
    End With
End Sub
Dạ đúng ý rồi anh. Cám ơn anh nhiều
 
Upvote 0
Dạ đúng ý rồi anh. Cám ơn anh nhiều
Mà nếu dùng cho ActiveSheet thì cần gì With nữa ta! Ngoại trừ đừng dùng code này khi sheet LDQuanLy đang hiện hành!

Mã:
Sub CopyCongSP()
    Dim lRs As Long
[COLOR=#ff0000]    lRs = LDQuanLy.Range("A" & Rows.Count).End(xlUp).Row[/COLOR]
    Cells(11, 1).FormulaR1C1 = "=IF(RC9<>"""",RC[93],"""")"
    Cells(11, 2).FormulaR1C1 = "=IF(RC9<>"""",RC[32],"""")"
    Cells(11, 3).FormulaR1C1 = "=IF(AND(RC9<>"""",RC[63]<>""""),RC[63],"""")"
[COLOR=#ff0000]    Range(Cells(11, 1), Cells(11, 3)).AutoFill Range(Cells(11, 1), Cells(lRs, 3))[/COLOR]
End Sub
 
Upvote 0
Mà nếu dùng cho ActiveSheet thì cần gì With nữa ta! Ngoại trừ đừng dùng code này khi sheet LDQuanLy đang hiện hành!

Mã:
Sub CopyCongSP()
    Dim lRs As Long
[COLOR=#ff0000]    lRs = LDQuanLy.Range("A" & Rows.Count).End(xlUp).Row[/COLOR]
    Cells(11, 1).FormulaR1C1 = "=IF(RC9<>"""",RC[93],"""")"
    Cells(11, 2).FormulaR1C1 = "=IF(RC9<>"""",RC[32],"""")"
    Cells(11, 3).FormulaR1C1 = "=IF(AND(RC9<>"""",RC[63]<>""""),RC[63],"""")"
[COLOR=#ff0000]    Range(Cells(11, 1), Cells(11, 3)).AutoFill Range(Cells(11, 1), Cells(lRs, 3))[/COLOR]
End Sub
Nếu muốn cho công thức thành giá trị Value thì sao hả anh
 
Upvote 0
Thêm đoạn này phía trên End Sub xem sao
PHP:
Cells.Copy
    Range("A1").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    Range("A1").Select
Ý cuả em chỉ muốn chuyển giá trị của 3 cột đó sang value, chứ không chuyển toàn bộ sheet ạ
 
Upvote 0
Ý cuả em chỉ muốn chuyển giá trị của 3 cột đó sang value, chứ không chuyển toàn bộ sheet ạ
Thử xem có được không! Không có file nên toàn đoán non đoán già không đó!

Mã:
Sub CopyCongSP()
    Cells(11, 1).FormulaR1C1 = "=IF(RC9<>"""",RC[93],"""")"
    Cells(11, 2).FormulaR1C1 = "=IF(RC9<>"""",RC[32],"""")"
    Cells(11, 3).FormulaR1C1 = "=IF(AND(RC9<>"""",RC[63]<>""""),RC[63],"""")"
[COLOR=#0000ff]    Dim lRs As Long, Rng As Range[/COLOR]
[COLOR=#0000ff]    lRs = LDQuanLy.Range("A" & Rows.Count).End(xlUp).Row[/COLOR]
[COLOR=#0000ff]    Set Rng = Range(Cells(11, 1), Cells(lRs, 3))[/COLOR]
[COLOR=#0000ff]    Range(Cells(11, 1), Cells(11, 3)).AutoFill Rng[/COLOR]
[COLOR=#0000ff]    Rng.Value = Rng.Value[/COLOR]
End Sub
 
Upvote 0
Mã:
Sub CopyCongSP()
    Cells(11, 1).FormulaR1C1 = "=IF(RC9<>"""",RC[93],"""")"
    Cells(11, 2).FormulaR1C1 = "=IF(RC9<>"""",RC[32],"""")"
    Cells(11, 3).FormulaR1C1 = "=IF(AND(RC9<>"""",RC[63]<>""""),RC[63],"""")"
[COLOR=#0000ff]    Dim lRs As Long, Rng As Range[/COLOR]
[COLOR=#0000ff]    lRs = LDQuanLy.Range("A" & Rows.Count).End(xlUp).Row[/COLOR]
[COLOR=#0000ff]    Set Rng = Range(Cells(11, 1), Cells(lRs, 3))[/COLOR]
[COLOR=#0000ff]    Range(Cells(11, 1), Cells(11, 3)).AutoFill Rng[/COLOR]
[COLOR=#0000ff] [/COLOR][B][COLOR=#ff0000]Calculate  [/COLOR][/B][COLOR=#0000ff] 
Rng.Value = Rng.Value[/COLOR]
End Sub
thêm cái đỏ đỏ phòng trường hợp máy tính không tự động chạy công thức, cái này tôi gặp hoài hà
 
Upvote 0
Sub CopyCongSP()
Cells(11, 1).FormulaR1C1 = "=IF(RC9<>"""",RC[93],"""")"
Cells(11, 2).FormulaR1C1 = "=IF(RC9<>"""",RC[32],"""")"
Cells(11, 3).FormulaR1C1 = "=IF(AND(RC9<>"""",RC[63]<>""""),RC[63],"""")"
Dim lRs As Long, Rng As Range
lRs = LDQuanLy.Range("A" & Rows.Count).End(xlUp).Row
Set Rng = Range(Cells(11, 1), Cells(lRs, 3))
Range(Cells(11, 1), Cells(11, 3)).AutoFill Rng
Calculate
Rng.Value = Rng.Value
Cells(11, 3). Format("000000000000")
End Sub
Em thêm vo chỗ màu đổ thì nó báo lỗi 400. Nhờ các anh chị xem giúp em
 
Lần chỉnh sửa cuối:
Upvote 0
Sub CopyCongSP()
Cells(11, 1).FormulaR1C1 = "=IF(RC9<>"""",RC[93],"""")"
Cells(11, 2).FormulaR1C1 = "=IF(RC9<>"""",RC[32],"""")"
Cells(11, 3).FormulaR1C1 = "=IF(AND(RC9<>"""",RC[63]<>""""),RC[63],"""")"
Dim lRs As Long, Rng As Range
lRs = LDQuanLy.Range("A" & Rows.Count).End(xlUp).Row
Set Rng = Range(Cells(11, 1), Cells(lRs, 3))
Range(Cells(11, 1), Cells(11, 3)).AutoFill Rng
Calculate
Rng.Value = Rng.Value
Cells(11, 3). Format("000000000000")
End Sub
Em thêm vo chỗ màu đổ thì nó báo lỗi 400. Nhờ các anh chị xem giúp em
Cells(11, 3).NumberFormat = "000000000000"
 
Upvote 0
Chào Các anh
Em muốn copy thêm cột 23,24,25,29 nằm tiếp theo
Mã:
Private Sub CommandButton1_Click()
Dim sArr(), dArr(), i As Long, j As Byte, n As Byte
With Sheet2
   sArr = .Range("G10", .[AI65536].End(3)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 4)
   For i = 1 To UBound(sArr, 1)
      For j = 1 To 4
         n = Choose(j, 1, 2, 3, 7)
         dArr(i, j) = sArr(i, n)
      Next
   Next
   Sheet1.[B65536].End(3)(2).Resize(i - 1, 4) = dArr
End With
End Sub
 
Upvote 0
Thì chép lại đoạn code kể từ sArr = .Range... cho đến Sheet1.[B...
Sau đó sửa G10 thành AC10, và Sheet1.[B65536].End(3)(2).Resize(i - 1, 4) thành Sheet1.[B65536].End(3)(2).Offset(1, 0).Resize(i - 1, 4)
Copy code tiếp chạy thì báo lỗi tài dòng màu đỏ
Mã:
Private Sub CommandButton1_Click()
Dim sArr(), dArr(), i As Long, j As Byte, n As Byte
With Sheet2
   sArr = .Range("G10", .[AI65536].End(3)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 4)
   For i = 1 To UBound(sArr, 1)
      For j = 1 To 4
         n = Choose(j, 1, 2, 3, 7)
         dArr(i, j) = sArr(i, n)
      Next
   Next
   Sheet1.[B65536].End(3)(2).Resize(i - 1, 4) = dArr
End With
With Sheet2
   sArr = .Range("AC10", .[AI65536].End(3)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 4)
   For i = 1 To UBound(sArr, 1)
      For j = 1 To 4
         n = Choose(j, 23, 24, 25, 29)
[COLOR=#ff0000]         dArr(i, j) = sArr(i, n)[/COLOR]
      Next
   Next
   Sheet1.[B65536].End(3)(2).Offset(1, 0).Resize(i - 1, 4) = dArr
End With
End Sub
 
Upvote 0
Copy code tiếp chạy thì báo lỗi tài dòng màu đỏ
Mã:
Private Sub CommandButton1_Click()
Dim sArr(), dArr(), i As Long, j As Byte, n As Byte
With Sheet2
   sArr = .Range("G10", .[AI65536].End(3)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 4)
   For i = 1 To UBound(sArr, 1)
      For j = 1 To 4
         n = Choose(j, 1, 2, 3, 7)
         dArr(i, j) = sArr(i, n)
      Next
   Next
   Sheet1.[B65536].End(3)(2).Resize(i - 1, 4) = dArr
End With
With Sheet2
   sArr = .Range("AC10", .[AI65536].End(3)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 4)
   For i = 1 To UBound(sArr, 1)
      For j = 1 To 4
         n = Choose(j, 23, 24, 25, 29)
[COLOR=#ff0000]        dArr(i, j) = sArr(i, n)[/COLOR]
      Next
   Next
   Sheet1.[B65536].End(3)(2).Offset(1, 0).Resize(i - 1, 4) = dArr
End With
End Sub

Xem lại cho kỹ tôi nói:

1. Copy phần bên trong block With, không phải copy cả block With. Nhưng cái này không quan trọng, chỉ tự nhiên 2 blocks with thì nó rườm rà thôi.

2. Tôi không hề bảo sửa phần n = Choose(j, 1, 2, 3, 7). Sửa phần này thì bị subscript out of range là phải rồi.
 
Upvote 0
Xem lại cho kỹ tôi nói:

1. Copy phần bên trong block With, không phải copy cả block With. Nhưng cái này không quan trọng, chỉ tự nhiên 2 blocks with thì nó rườm rà thôi.

2. Tôi không hề bảo sửa phần n = Choose(j, 1, 2, 3, 7). Sửa phần này thì bị subscript out of range là phải rồi.
Cám ơn bạn nhiều nha
Trường hợp mình muốn bỏ những o trống được không
Mã:
Private Sub CommandButton1_Click()
Dim sArr(), dArr(), i As Long, j As Byte, n As Byte
With Sheet2
   sArr = .Range("G10", .[AI65536].End(3)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 4)
   For i = 1 To UBound(sArr, 1)
      For j = 1 To 4
         n = Choose(j, 1, 2, 3, 7)
         dArr(i, j) = sArr(i, n)
      Next
   Next
   Sheet1.[B65536].End(3)(2).Resize(i - 1, 4) = dArr
   sArr = .Range("AC10", .[AI65536].End(3)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 4)
   For i = 1 To UBound(sArr, 1)
      For j = 1 To 4
         n = Choose(j, 1, 2, 3, 7)
         dArr(i, j) = sArr(i, n)
      Next
   Next
   Sheet1.[B65536].End(3)(2).Offset(1, 0).Resize(i - 1, 4) = dArr
End With
End Sub
 
Upvote 0
Cám ơn bạn nhiều nha
Trường hợp mình muốn bỏ những o trống được không
Mã:
Private Sub CommandButton1_Click()
Dim sArr(), dArr(), i As Long, j As Byte, n As Byte
With Sheet2
   sArr = .Range("G10", .[AI65536].End(3)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 4)
   For i = 1 To UBound(sArr, 1)
      For j = 1 To 4
         n = Choose(j, 1, 2, 3, 7)
         dArr(i, j) = sArr(i, n)
      Next
   Next
   Sheet1.[B65536].End(3)(2).Resize(i - 1, 4) = dArr
   sArr = .Range("AC10", .[AI65536].End(3)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 4)
   For i = 1 To UBound(sArr, 1)
      For j = 1 To 4
         n = Choose(j, 1, 2, 3, 7)
         dArr(i, j) = sArr(i, n)
      Next
   Next
   Sheet1.[B65536].End(3)(2).Offset(1, 0).Resize(i - 1, 4) = dArr
End With
End Sub

Muốn bỏ qua dòng trống thì bạn phải dùng thêm câu lệnh if trong vòng lặp để bẫy rồi đồng thời khai báo thêm biến để xác định dòng dữ liệu để nạp vào mảng kết quả xuất ra

[GPECODE=vb]
Private Sub CommandButton1_Click()
Dim sArr(), dArr(), i As Long, j As Byte, n As Byte, k As Long
With Sheet2
sArr = .Range("G10", .[AI65536].End(3)).Value
ReDim dArr(1 To UBound(sArr), 1 To 4)
For i = 1 To UBound(sArr, 1)
If sArr(i, 1) <> "" Then

k = k + 1
For j = 1 To 4
n = Choose(j, 1, 2, 3, 7)

dArr(k, j) = sArr(i, n)

Next
End If
Next


End With
Sheet1.[B65536].End(3)(2).Resize(k, 4) = dArr
End Sub


[/GPECODE]
 
Upvote 0
@nmhung49:
Người hỏi không nêu rõ ràng điều kiện "dòng trống" có nghĩa là gì. Code của bạn chỉ xét ô đầu tiên trong dòng.
Đối với những người hỏi lơ mơ như vầy, ta chỉ có thể mách đường đi thôi, còn chi tiết code là của họ.
 
Upvote 0
@nmhung49:
Người hỏi không nêu rõ ràng điều kiện "dòng trống" có nghĩa là gì. Code của bạn chỉ xét ô đầu tiên trong dòng.
Đối với những người hỏi lơ mơ như vầy, ta chỉ có thể mách đường đi thôi, còn chi tiết code là của họ.
Code copy diễn đàn viết lai thoi anh co code nao ngắn chi giup
sao kết quả giống như file la duoc
 
Upvote 0
@nmhung49:
Người hỏi không nêu rõ ràng điều kiện "dòng trống" có nghĩa là gì. Code của bạn chỉ xét ô đầu tiên trong dòng.
Đối với những người hỏi lơ mơ như vầy, ta chỉ có thể mách đường đi thôi, còn chi tiết code là của họ.
Vì thấy có bảng kết quả mong muốn nên đoán là bỏ dòng trống là dòng không có dữ liệu --=0--=0
Em nghĩ bạn ấy cũng muốn học code và ra kết quả là được, em cũng giải thích tay ngang cho bạn ấy hiểu chứ code chủ yếu học từ diễn đàn mà ra.
 
Upvote 0
Muốn bỏ qua dòng trống thì bạn phải dùng thêm câu lệnh if trong vòng lặp để bẫy rồi đồng thời khai báo thêm biến để xác định dòng dữ liệu để nạp vào mảng kết quả xuất ra

[GPECODE=vb]
Private Sub CommandButton1_Click()
Dim sArr(), dArr(), i As Long, j As Byte, n As Byte, k As Long
With Sheet2
sArr = .Range("G10", .[AI65536].End(3)).Value
ReDim dArr(1 To UBound(sArr), 1 To 4)
For i = 1 To UBound(sArr, 1)
If sArr(i, 1) <> "" Then

k = k + 1
For j = 1 To 4
n = Choose(j, 1, 2, 3, 7)

dArr(k, j) = sArr(i, n)

Next
End If
Next


End With
Sheet1.[B65536].End(3)(2).Resize(k, 4) = dArr
End Sub

[/GPECODE]
BẠn có thể bổ sung thêm cột AC được không
Cám ơn bạn nha
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom