Hỏi về thuật toán

Liên hệ QC

Nguyen Rem

Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia
23/2/22
Bài viết
211
Được thích
30
Giới tính
Nữ
Em chào các anh chị :))))
Em đang có một chút vấn đề sau mong anh chị cho em hướng giải quyết . Em cảm ơn anh chị nhiều
Giả sử trong một sheet tên là "Hello" ta có một bảng dữ liệu có số cột là x
Nếu x chia hết cho 3 thì
Ta tạo x/3 sheet mới bên trong một workbook khác
Câu hỏi:
Viết câu lệnh thế nào để cứ mỗi 3 cột trong sheet tên "Hello" sẽ "đưa" được vào trong mỗi sheet vừa được tạo . Em mới học VBA nên mong các anh chị giải thích code của anh chị giúp em ^^
 
Lần chỉnh sửa cuối:
Em chào các anh chị :))))
Em đang có một chút vấn đề sau mong anh chị cho em hướng giải quyết . Em cảm ơn anh chị nhiều
Giả sử trong một sheet tên là "Hello" ta có một bảng dữ liệu có số cột là x
Nếu x chia hết cho 3 thì
Ta tạo x/3 sheet mới bên trong một workbook khác
Câu hỏi:
Viết câu lệnh thế nào để cứ mỗi 3 cột trong sheet tên "Hello" sẽ "tống" được vào trong mỗi sheet vừa được tạo . Em mới học VBA nên mong các anh chị giải thích code của anh chị giúp em ^^
Phai chăng là như thế này
Mã:
Sub ABC()
Dim Wb As Workbook, X&, i&
X = 12
Workbooks.Add
Set Wb = ActiveWorkbook
With ThisWorkbook.Sheets("Hello")
    For i = 1 To X Step 3
        Wb.Sheets.Add
        .Columns(i).Resize(, 3).Copy Wb.ActiveSheet.Range("A1")
    Next
End With
End Sub
 
Upvote 0
Phai chăng là như thế này
Mã:
Sub ABC()
Dim Wb As Workbook, X&, i&
X = 12
Workbooks.Add
Set Wb = ActiveWorkbook
With ThisWorkbook.Sheets("Hello")
    For i = 1 To X Step 3
        Wb.Sheets.Add
        .Columns(i).Resize(, 3).Copy Wb.ActiveSheet.Range("A1")
    Next
End With
End Sub
Lấy toàn bộ 3 cột liệu có chậm hơn là chỉ lấy đến dòng cuối không nhỉ?
 
Upvote 0
Phai chăng là như thế này
Mã:
Sub ABC()
Dim Wb As Workbook, X&, i&
X = 12
Workbooks.Add
Set Wb = ActiveWorkbook
With ThisWorkbook.Sheets("Hello")
    For i = 1 To X Step 3
        Wb.Sheets.Add
        .Columns(i).Resize(, 3).Copy Wb.ActiveSheet.Range("A1")
    Next
End With
End Sub
Anh ơi! Anh cho em hỏi cái X& với i& nó có phải là
X& = X&"" (có kiểu dữ liệu là String)
i& = i&"" (có kiểu dữ liệu là String)
đúng không ạ ?
Bài đã được tự động gộp:

Phai chăng là như thế này
Mã:
Sub ABC()
Dim Wb As Workbook, X&, i&
X = 12
Workbooks.Add
Set Wb = ActiveWorkbook
With ThisWorkbook.Sheets("Hello")
    For i = 1 To X Step 3
        Wb.Sheets.Add
        .Columns(i).Resize(, 3).Copy Wb.ActiveSheet.Range("A1")
    Next
End With
End Sub
Em thấy hình như là ổn rồi anh ạ . Để em thử rồi có gì báo lại anh sau ^^
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Em chào các anh chị :))))
Em đang có một chút vấn đề sau mong anh chị cho em hướng giải quyết . Em cảm ơn anh chị nhiều
Giả sử trong một sheet tên là "Hello" ta có một bảng dữ liệu có số cột là x
Nếu x chia hết cho 3 thì
Ta tạo x/3 sheet mới bên trong một workbook khác
Câu hỏi:
Viết câu lệnh thế nào để cứ mỗi 3 cột trong sheet tên "Hello" sẽ "đưa" được vào trong mỗi sheet vừa được tạo . Em mới học VBA nên mong các anh chị giải thích code của anh chị giúp em ^^
Tiêu đề là hỏi thuật toán trong bài là hỏi code là sao.Bạn có biết thuật toán là thế nào không.Và vẽ sơ đồ thuật toán chưa.
 
Upvote 0
Nó bằng X as Long, i as Long

Ba cái kiểu viết #$%& đó bỏ đi. Chỉ có hại.

Copy đại nên không nhớ nguồn.
Người ta đang hỏi về tầm vực, tại sao lại chọn kiểu Long, mà không phải là Double, Integer, Byte, String, Variant.

tại sao nó lại có kiểu Long không
 
Upvote 0
Tiêu đề là hỏi thuật toán trong bài là hỏi code là sao.Bạn có biết thuật toán là thế nào không.Và vẽ sơ đồ thuật toán chưa.
À cái này em nghĩ là hoàn toàn bình thường mà anh ^^ . Nếu anh góp ý thuật toán giúp em thì em vẫn sẵn sàng thảo luận mà , em có bỏ dở bài viết của ai đâu :)) em vẫn đang theo dõi từng bài viết mọi người ấy anh góp ý mà anh . Mọi người góp ý code thì em cũng thảo luận về mặt code . Còn về thuật toán thì anh nói đúng . Em chưa học nên nếu có thể nói sai thuật ngữ nhiều . Mong anh sửa giúp em
 
Upvote 0
Nói về thuật toán:
- đi tìm X. Không phải X có sẵn là 12 như code trên: tìm cột cuối, X = cuối - đầu + 1
- Tạo 1 workbook
- Duyệt từ 1 đến X, bước là 3.
- mỗi lần tạo 1 sheet mới trong workbook mới
- mỗi lần lấy 3 cột, copy và paste vào
Nói về chi tiết:
- Có thể lưu workbook liền hoặc từ từ rồi lưu
- Có thể đặt tên mỗi sheet khi tạo ra
- Đặt trường hợp chia không hết cho 3: Xử lý thế nào?
- Copy cả cột hay tìm dòng cuối từng nhóm 3 cột? Không cần thiết lắm.
- Lưu ý khi tạo workbook mới thì workbook đó là activeworkbook. Tạo sheet mới cũng thế. Copy từ đâu, paste vào đâu phải cẩn thận.
 
Upvote 0
Em cảm ơn các anh đã đọc bài của em . Em đã hoàn thành được rồi ạ ^^. Nó ở trong Module 3 ạ :)))))
 

File đính kèm

  • revdata.xlsm
    976.6 KB · Đọc: 6
Upvote 0
$ # &:
Hồi xưa, BASIC không có khai báo kiểu. Máy thì bộ nhớ rất giới hạn. Trình dịch theo tên đặt mà biết kiểu. Thường thì cuối tên có $ là chuỗi, ký tự mắt đầu IJKLMN thì là Integer (lúc đó chưa có Long) các tên khác thì là Float (Single) - tôi quên mất Double là gì rồi.
Từ khoá Dim giành cho khai báo mảng.

Với kỹ thuật hiện đại, máy chạy rất hiệu quả cho nên trình dịch đọc Dim abc$ chẳng khác Dim abc as String bao nhiêu. Và dân khai báo chia ra làm hai trường phái:
1. dân bênh vực các dấu hiệu kia thì nói rằng đọc quen sẽ biết, và gõ vậy cho gọn.
2. dân bênh vực khai rõ ràng As cái gì đó thì thống nhất ngôn ngữ dùng hơn - không lý gì khai báo object thì dùng As trong khi khai báo kiểu căn bản lại dùng ký hiệu.

Tôi lười khai báo lắm. Chỉ khai khi có khả năng bị lẫn với biến toàn cục.

Ba cái kiểu viết #$%& đó bỏ đi. Chỉ có hại.
...
Bên trường phái kia cũng có lý của họ. Tuy nhiên tôi đồng ý với bạn là mới học thì NÊN dùng loại khai As cái gì đó. Loại kia cần yếu tố "quen".

...
Người ta đang hỏi về tầm vực, tại sao lại chọn kiểu Long, mà không phải là Double, Integer, Byte, String, Variant.
Tầm vực là scope (toàn cục, cục bộ,...) của biến. Kích cỡ là số bytes mà biến chiếm trong bộ nhớ (memnory size). Giới hạn là độ lớn/nhỏ của số mà biến có thể chứa (range).

Hiện nay, với Win 7 thì kiểu Long là hiệu quả nhất. Các kiểu khác chỉ dùng khi bị bắt buộc. Ví dụ mảng rất lớn thì kiểu Byte chỉ bằng nửa kiểu Integer và 1/4 kiểu Long. Số lớn hơn 2 tỷ thì nên đổi qua Double tốt hơn.
 
Upvote 0
Tiêu đề là hỏi thuật toán trong bài là hỏi code là sao.Bạn có biết thuật toán là thế nào không.Và vẽ sơ đồ thuật toán chưa.
Đúng ra là hỏi thuật toán. Chỉ do thớt bị lạc đường.

Thuật toán là như vầy:
- dùng con toán tính ra cột cuối cùng colLast (con toán tương tự như tính dòng cuối).
- nếu colLast \ 3 <> 0 Then Exit Sub
điều kiện này thớt nêu ra ở bài #1: Nếu x chia hết cho 3 thì
nếu không phải vậy thì thớt nên tìm học cách xác định lô gic trước khi học thuật toán và code. Khong biết cách trình bày lô gic thì không thể học được cái gì cả.
- mở workbook mới
- Set rg = Range("A:A")
For i = 1 To colLast Step 3
' code tạo sheet mới và copy rg sang ở đây
Set rg = rg.Offset(0, 3)
Next i
 
Upvote 0
Upvote 0
Em cảm ơn các anh nhiều ^^ . Nhưng hiện tại em đang bận quá vẫn chưa có thời gian xem mọi người thảo luận thuật toán hi . Nhưng không sao có thời gian là em vô xem lại liền
 
Upvote 0
Web KT

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

Back
Top Bottom