Copy select range sang sheet khác

Liên hệ QC

win4u

Thành viên mới
Tham gia
16/1/08
Bài viết
43
Được thích
3
Em đã tìm nhưng kg thấy, bác nào cho em code VBA nếu em muốn:
Sau khi select 1 range trong sheet1 (hoặc từ 1 sheet của một file excel khác cùng trong 1 folder) và chạy macro thì nó import (copy) sang dòng cuối của sheet2!A1 nhưng thay đổi thứ tự các cột.
Nếu text trong sheet2 cột F trùng với text cột B sheet1 thì copy dòng text đó vào cuối sheet có tên = text

PS.:
Em muốn biết lý do bài này của em bị xóa
http://www.giaiphapexcel.com/forum/showthread.php?t=12077
Em sẽ xóa PS này đi sau khi nhận đc câu trả lời.

Tiêu đề của bạn : Giúp em hoàn thành nốt
tiêu đề không rõ ràng bạn ạ. Khi muốn hỏi một vấn đề gì thì nên dùng 1 câu gì đó khái quát tất cả nội dung cần hỏi, tránh dùng các từ "Giúp", "cứu", "help", "gấp" . . . mang tính cầu xin, vì đây là một sân chơi bình đẳng.
Khi tiêu đề khái quát nội dung thì người đọc sẽ hình dung ngay ra vấn đề cần giải đáp, tránh mất thời gian cần thiết, đó cũng chính là sự tôn trọng người đọc.
Rất mong bạn thông cảm và tuân thủ điều này.
Thân!
MrOkebab!


 
Chỉnh sửa lần cuối bởi điều hành viên:
Đến như mình, mình cũng không thể xem được bài này khi bấm vô đường dẫn bạn đưa thì khó trả lời cho bạn được. Tuy nhiên mình vẫn ghi cho bạn đỡ phần nào sốt ruột
Em đã tìm nhưng kg thấy, bác nào cho em code VBA nếu em muốn:
Sau khi select 1 range trong sheet1 (hoặc từ 1 sheet của một file excel khác cùng trong 1 folder) và chạy macro thì nó import (copy) sang dòng cuối của sheet2!A1 nhưng thay đổi thứ tự các cột.
Nếu text trong sheet2 cột F trùng với text cột B sheet1 thì copy dòng text đó vào cuối sheet có tên = text
Mình hình dung câu hỏi bạn như thế này:
Tôi chọn vùng A5:C13 của sheet1; giờ muốn đem đến 2 nơi của sheet2 (vì cột B&C của nguồn lại muốn chép vô cột 'A' của sheet sau(!)
Vậy bạn phải dùng 2 dòng lệnh thôi, 1 dòng không đặng đâu
PHP:
 Sheet1.select
 With Sheet2
      Range("B5:C13").Copy Destination:=.Range("A" & .[A65432].End(XlUp).Row + 1)
      Range("A5:A13").Copy Destination:=.Range("C" & .[C65432].End(XlUp).Row + 1)
 End With
Bạn chú ý chép đủ hết các dấu chấm đó nha!

Thân ái!
 
Upvote 0
Em gửi file có ví dụ thế này cho dễ ạ.
Từ sheet1 copy sang sheet2
Từ sheet1 copy sang !N sheet khác có tên trùng với text ở vùng E:E.Select

Cái chính là em kg biết cách xác định min và max của select range.
Và cũng kg biết viết vòng lặp thế nào cho chuẩn vì phải xác định đc min và max của rang đc chọn.
Không biết sử dụng câu lệnh so sánh (nếu text ở cột E thì copy sang sheet khác có tên như vậy).

Em kg cần gom 2 cells ở sheet1 thành 1 cell ở sheèt đâu ạ
Bác giúp em nhá.
 

File đính kèm

  • demo.xls
    36 KB · Đọc: 57
Upvote 0
Tiên đây cho em hỏi luôn:
1) Làm sao để excel hiểu đc số 1111.000,00 và số 1111,000.00 đều là number mà kg cần thay đổi Settings trong Control Panel.
2) Làm sao biết đc dòng + cột đầu tiên và dòng + cột cuối cùng của một RangeSelection.
 
Lần chỉnh sửa cuối:
Upvote 0
Tiên đây cho em hỏi luôn:
1) Làm sao để excel hiểu đc số 1111.000,00 và số 1111,000.00 đều là number mà kg cần thay đổi Settings trong Control Panel.
2) Làm sao biết đc dòng + cột đầu tiên và dòng + cột cuối cùng của một RangeSelection.
Câu 1: Tôi nghĩ có lẽ dùng vòng lập quét qua các ký tự số, rồi thay dấu phẩy và chấm thành rổng (có thể dùng hàm SUBSTITUTE để làm việc này)
Câu 2:
Dongdau = Rng.Row
Cotdau = Rng.Column
Dongcuoi = Rng.Row + Rng.Rows.Count - 1
Cotcuoi = Rng.Column + Rng.Columns.Count - 1

Trong đó Rng là vùng nào đó
 
Upvote 0
Tiên đây cho em hỏi luôn:
Làm sao để excel hiểu đc số 1111.000,00 và số 1111,000.00 đều là number mà kg cần thay đổi Settings trong Control Panel.
Nếu các số đó bên bảng tính chấp nhận là số thì VBA vẫn coi là số. Chẳng qua là do khai báo trong Control Panel.
 
Upvote 0
Câu 2:
Dongdau = Rng.Row
Cotdau = Rng.Column
Dongcuoi = Rng.Row + Rng.Rows.Count - 1
Cotcuoi = Rng.Column + Rng.Columns.Count - 1


Nhưng như thế này nó kg chạy

Mã:
 Sub selection_range()
Dim Rng As Range

Sheet1.Select
Set Rng = Nothing
On Error Resume Next
Rng = Selection.SpecialCells(xlCellTypeVisible)

dongdau = Rng.Row
cotdau = Rng.Column
dongcuoi = Rng.Row + Rng.Rows.Count - 1
cotcuoi = Rng.Column + Rng.Columns.Count - 1

Range(cotdau & dongdau).Select
Selection.Copy

Range(dongcuoi + 5 & cotcuoi + 5).Select
ActiveSheet.Paste
End Sub
 
Upvote 0
Ý tưởng convert text to number của em nó như thế này ạ.

Mã:
Sub Convert_Number()
    Dim Numb As Currency
    Dim Rng As Range

'Xác định vùng cần convert
    Set Rng = Nothing
    On Error Resume Next
    Rng = Selection.SpecialCells(xlCellTypeVisible)
    
    For i = 1 To Rng
    'cho gia tri o cell(1,1) vao Numb
        Cells(i, 1) = Numb
    'chuyen doi so trong Numb thanh Number
        Numb = CCur(Numb.Text)
    'gan so da dc format thanh Number nguoc tro lai cho Cell
        Numb = Cells(i, 1)
        i = i + 1
    Next
    
End Sub
 
Upvote 0
Upps, em vừa tìm thấy

Mã:
Sub ConvertText()
    For Each cell In Selection
        cell.Value = Val(cell.Value)
    Next
    Selection.NumberFormat = "General"
End Sub
 
Upvote 0
Nguyên văn bởi win4u
Nhưng như thế này nó kg chạy
Mã:
Code:
 Sub selection_range()
    Dim Rng As Range
      Sheet1.Select
        Set Rng = Nothing
        On Error Resume Next
        Rng = Selection.SpecialCells(xlCellTypeVisible)
        dongdau = Rng.Row
        cotdau = Rng.Column
        dongcuoi = Rng.Row + Rng.Rows.Count - 1
        cotcuoi = Rng.Column + Rng.Columns.Count - 1
            Range(cotdau & dongdau).Select
               Selection.Copy
           Range(dongcuoi + 5 & cotcuoi + 5).Select
              ActiveSheet.Paste
End Sub
Bạn xem lại mấy chỗ sau:
-Rng là biến đối tượng. Khi gán giá trị phải dùng Set.
-Rng đã là vùng chọn ngay từ đầu. Bạn đâu cần phải chọn lại nữa.
-Viết thế này Excel sẽ không hiểu: Range(cotdau & dongdau).Select
 
Upvote 0
Mã:
Range(cotdau & dongdau).Select

Câu lệnh này thực chất em muốn thể hiện cột đầu tiên và dòng đầu tiên của rangeselection

còn set rng như thế này đã đc chưa ạ ?
Mã:
Set Rng = ActiveWindow.RangeSelection
 
Upvote 0
Em đã sửa lại thành thế này, nhưng
1- bị báo lỗi Loop without Do
2- bác kiểm tra trước giúp em xem như thế này đã đúng chưa ạ.

Mã:
Sub copy_data()
Dim Rng As Range
Dim ws As Worksheet

    
rCount = ActiveWindow.RangeSelection.Rows.Count
cCount = ActiveWindow.RangeSelection.Columns.Count
Set Rng = ActiveWindow.RangeSelection
    
If cCount > 0 Then
    Dim IntRow As Long


    IntRow = actRng.Rows.Count
    Count = 1
    Count2 = 1
Do
    If Rng <> "" Then
        With Rng
            ngay = .Cells(Count, Count2).Value
            khach = .Cells(Count, Count2 + 1).Value
            vao = .Cells(Count, Count2 + 2).Value
            ra = .Cells(Count, Count2 + 3).Value
        End With
    End If
    
    For Each ws In Worksheets
        If ws.Name = khach Then
            Set ws = Worksheets(khach)
            irow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
            With Worksheets(khach)
                .Cells(irow, 1).Value = ngay
                .Cells(irow, 2).Value = vao
            End With
        End If
    
    Count = Count + 1
    Count2 = Count2 + 1
Loop Until Count = IntRow
        
End If

End Sub
 
Upvote 0
1. Đoạn code bị báo lỗi Loop without Do vì bạn có For mà thiếu Next.
2. Bạn gởi file lên để có dữ liệu dễ kiểm tra hơn.
 
Upvote 0
Ví dụ đây ạ.
Em muốn select 1 range trong 1 sheet nào đó và chạy macro. Nếu text ở dòng 1, cột 2 trùng với tên sheet trong workbook thì copy data sang sheet đó theo 1 trật tự khác.
 

File đính kèm

  • vidu.xls
    18.5 KB · Đọc: 23
Upvote 0
Mã:
Sub A_copy()
Dim Rng As Range
Dim ws As Worksheet
rCount = ActiveWindow.RangeSelection.Rows.Count
cCount = ActiveWindow.RangeSelection.Columns.Count
Set Rng = ActiveWindow.RangeSelection
    If cCount > 0 Then
    Dim IntRow As Long
       IntRow = Rng.Rows.Count
    Count = 1
    Count2 = 1
Do
    If Rng <> "" Then
        With Rng
            ngay = .Cells(Count, Count2).Value
            khach = .Cells(Count, Count2 + 1).Value
            vao = .Cells(Count, Count2 + 2).Value
            ra = .Cells(Count, Count2 + 3).Value
        End With
    End If
    For Each ws In Worksheets
        If ws.Name = khach Then
            Set ws = Worksheets(khach)
            irow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
            With Worksheets(khach)
                .Cells(irow, 1).Value = ngay
                .Cells(irow, 2).Value = vao
            End With
        End If
    Next
    Count = Count + 1
    Count2 = Count2 + 1
Loop Until Count = IntRow
End If
End Sub
Đoạn code trên mắc khá nhiều lỗi. Mình góp ý, bạn tự sửa nhé.
-Biến rCount không được sử dụng và trùng với biến IntRow.
-Câu lệnh If Rng <> "" sẽ bị báo lỗi vì sai cú pháp. Rng không phải là biến chuỗi. Và điều kiện này là thừa. Ở trên, bạn đã viết:If cCount > 0
-Biến Count2 cũng bị thừa. Count2 chỉ số cột trong vùng. Không thể tăng (+1) như số dòng được.
-Vòng lặp Do luôn chạy thiếu 1 dòng vì câu lệnh: Loop Until Count = IntRow đặt sau: Count = Count + 1.
 
Upvote 0
Nhân đây các bạn xem sửa giúp nhé .
Cảm ơn
 

File đính kèm

  • Chuyen.xls
    28 KB · Đọc: 14
Upvote 0
Các sư phụ xem giùm trong file kèm. Tại sao dòng lệnh này lại chạy sai.

Mã:
        If khach <> ws.Name Then
            Set ws = Worksheets("Sai sot")
            irow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
            With Sheets("Sai sot")
                .Cells(irow, 1).Value = ngay
                .Cells(irow, 2).Value = khach
                .Cells(irow, 3).Value = vao
                .Cells(irow, 10).Value = ra
            End With
 

File đính kèm

  • vidu.xls
    33 KB · Đọc: 23
Upvote 0
Web KT
Back
Top Bottom