Cho em hỏi ý nghĩa của cú pháp.

Liên hệ QC

hungdp73

Thành viên mới
Tham gia
11/9/10
Bài viết
17
Được thích
9
Với cú pháp (hay câu lệnh) : ActiveCell.Offset(0, 1).Range("A1").Select

PHần đầu thì em hiểu là di chuyển qua 1 cột còn phần "Range("A1").Select" thì em không hiểu. Tại sao lại hay có "A1"?

Cám ơn nhiều.
 
Với cú pháp (hay câu lệnh) : ActiveCell.Offset(0, 1).Range("A1").Select

PHần đầu thì em hiểu là di chuyển qua 1 cột còn phần "Range("A1").Select" thì em không hiểu. Tại sao lại hay có "A1"?

Cám ơn nhiều.
Mình thấy câu lệnh của bạn hơi lạ, theo mình thì chỉ cần như thế này là đủ:
PHP:
ActiveCell.Offset(0, 1).Select
Có điều lạ là code khi chạy thì 2 câu lệnh trên có kết quả như nhau (đều chọn ô bên phải ô đã chọn).
 
Upvote 0
Nếu ta có macro như sau:

PHP:
Sub GPE_COM()
 ActiveCell.Offset(0, 1).Range("A1").Select
 MsgBox Selection.Address
End Sub

(1) Bạn hãy chọn vùng từ B8:C10 & cho chạy macro ta sẽ thu được hộp thoại: $D$8

(2) Nếu ta chọn vùng D6:H10 mà trong vùng đó ta đã trộn D6:D7 & E6:H6 & cho chạy macro, thì trong hộp thoại sẽ xuất hiện $E$6:$H$6;

Bạn thử tiếp theo nha!

Nhưng bài này đã được MOD/SMOD nào đó chuyển về đúng BOX dùm bạn rồi đó; Lần sau cần chú í hơn tẹo nha!
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
ActiveCell.Offset(0, 1).[COLOR="red"]Range("A1")[/COLOR].Select

Tại ô hiện tại, dời qua 1 cột rồi lại chọn A1 => sao không chọn A1 ngay từ đầu nhỉ?
Mã:
Sheets(1).Activate
Range("A1").select

Còn nếu muốn chọn ô đầu tiên của vùng đang chọn thì sao không:
Mã:
ActiveCell.Offset(0, 1).Cells(1,1).Select

Mới học viết code, không biết đúng không !$@!!
 
Upvote 0
Thực ra, câu lệnh này em trích trong 1 bài về user form của tác giả Ông Văn Thông.
"...
Sheets("Sheet2").Select:Range("MyDBStart").Select
ActiveCell.Offset(Range("ToTalRecord").Value,0).Range("A1").Select
ActiveCell.Offset(0,0).Range("A1").Select:ActiveCell.Value=XDate
ActiveCell.Offset(0,0).Range("A1").Select:ActiveCell.Value=XSo
ActiveCell.Offset(0,0).Range("A1").Select:ActiveCell.Value=XLoai
..."
Đại khái là có 1 user form và điền tất cả thông tin trên vào 1 hàng (record) của excel. Em thắc mắc là tại sao lại cứ phải có "A1".
 
Upvote 0
(1) Đầu tiên bạn cần biết vùng có tên 'MyDBSTart' là gồm những ô nào

(2) Có thể dùng hộp thoại MsgBox để trao đổi thôn tin với đoạn mã trên, như sau:

PHP:
 Sheets("Sheet2").Select:Range("MyDBStart").Select
    MsgBox Selection.Address,,"GPE 1"
ActiveCell.Offset(Range("ToTalRecord").Value,0).Ra nge("A1").Select
    MsgBox Selection.Address,,"GPE 2"
 ActiveCell.Offset(0,0).Range("A1").Select:ActiveCe ll.Value=XDate
        MsgBox Selection.Address,,xDate
 ActiveCell.Offset(0,0).Range("A1").Select:ActiveCe ll.Value=XSo
            MsgBox Selection.Address,,XSo
 ActiveCell.Offset(0,0).Range("A1").Select:ActiveCe ll.Value=XLoai
            MsgBox Selection.Address,,XLoai


Chúc thành công.
 
Upvote 0
Em lại bị lỗi này nữa ạ.
Nội dung là em có 1 sheet("Form") là form nhập liệu, sau đó sẽ tuần tự chép vào sheet("Sheet2") làm database

For i = 1 To XRecords
Sheets("Forms").Select
Range("YarnSupplier").Select: XSupplier = ActiveCell.Value
ActiveCell.Offset(1, 0).Range("A1").Select: XDate = ActiveCell.Value
Range("StartYarnInput").Select
ActiveCell.Offset(i - 1, 0).Range("A1").Select: XLoai = ActiveCell.Value
ActiveCell.Offset(0, 2).Range("A1").Select: XSoLuong = ActiveCell.Value
ActiveCell.Offset(0, 1).Range("A1").Select: XDonGia = ActiveCell.Value 'Sau khi gán các nộii dung -người sử dụng nhập- vào biến

Sheets("Sheet2").Select 'Chọn Sheet2
Range("A3").Select 'Chọn ô đầu tiên của database, tới đây thì chương trình báo lỗi các bác ạ !$@!!.
ActiveCell.Offset(Range("TOTALYARNRECORD").Value, 0).Range("A1").Select
ActiveCell.Value = XDate
ActiveCell.Offset(0, 1).Range("A1").Select: ActiveCell.Value = XSupplier
ActiveCell.Offset(0, 1).Range("A1").Select: ActiveCell.Value = XLoai
ActiveCell.Offset(0, 2).Range("A1").Select: ActiveCell.Value = XSoLuong
ActiveCell.Offset(0, 1).Range("A1").Select: ActiveCell.Value = XDonGia
Range("$C$1").Select: ActiveCell.Value = ActiveCell.Value + 1
Next

Nội dung báo lỗi : Run-time error '1004' : Select method of Range class failed.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhìn vô code của bạn rườm rà quá, hoa cả mắt;

Chúng ta thảo luận lại ngay từ đầu công việc của bạn, nha:

Có fải bạn muốn DL (dữ liệu) nhập vô trang 'Form'; Kiểm tra, thấy đúng rối thì a lê hấp, chép sang CSDL (Sheet2)

Xảy ra 1 số trường hợp sau:

(1) Bạn cần chép 1 lúc nhiều recodds từ 'Form'; Trường hợp này ta cần chép 1 hay 1 số vùng DL bên 'Form' sang CSDL

(2) Bạn nhập DL vô 'Form' theo dạng từ trên xuống (dạng cột - theo như cách tôi gọi trong trường hợp này); Nhưng cần chép sang trang CSDL dạng 01 hàng; (DL cũng có thể nhập rãi rác trên 'Form' thuộc nhiều cột & nhiều hàng;)

(3) Cách của bạn mà tôi chưa biết đến . . .


Nhưng trong mọi trường hợp, quan trọng là ta fải tìm dòng cuối của CSDL & chép vô dưới nó;
Nếu chép DL từ trang tính, thì tôi chắc không cần biến đâu; Mà ta nên áp dụng fương cách gán DL trực tiếp thì hay hơn.

(Mình sẽ tìm bài giống như cách mình nói trên để bổ sung bạn tham khảo; Nhắc thêm bạn là thầy Ông Văn Thông đôi lúc cũng vẽ vời lắm)
 
Upvote 0
Đúng bác ạ!
Em muốn lấy dữ liệu từ form vào database.
Form : ví dụ 1 khách có thể mua nhiều mặt hàng nhưng khi vào database thì mỗi dòng vẫn phải từng field ngày, tên KH, mặt hàng, số lượng...
Đương nhiên em có 1 ô chứa total records. Sau khi chép xong 1 record thì tăng lên 1. Khi cần lưu 1 record mới em lại nhảy về ô đầu tiên của database rồi offset theo dạng vị trí hiện hành + total record đến hàng cuối của data ...
Mong giúp đỡ.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình mường tượng ra thế này:

Trang 'Form' giống như 1 hóa đơn mua/bán hàng;
Gồm fần chung, như [Ngày], [MaKHàng], [DiaChi], [MaSóThuế],. . . .
Fần chi tiết gồm [MaHàng], [DVTính], [SoLg], [DGia], [TTien]

Theo thói thường, nếu giao dịch nhiều, thì nhười ta lưu thành 2 Tables , 1 Table là fần chung như trên, & 1 Table nữa là fần chi tiết. Tất nhiên chúng liên lạc với nhau bằng mã do ta ấn định.

Nếu đơn giản trong giao dịch thì có thể nhập chung thành 1 table trên 1 trang tính; Nhưng như vậy sẽ có 1 số trường trùng lặp thông tin không cần thiết.

Hãy cho biết bạn muốn ở trang CSDL như thế nào trong 2 trường hợp trên?

Tốt hơn hết chúng ta bàn rốt ráo cấu trúc CSDL đã, để sau này khỏi tốn thời gian sửa chữa hay thay đổi.

Còn cái chuyện copy & paste không là gì với cộng đồng chúng ta. . .

Chờ tin từ bạn!
 
Upvote 0
Sau khi biết thêm paste & copy, đọc lại đoạn code trên của em thì đúng là loằng ngoằng thật. Em trước đây biết pascal thôi sau này tình cờ biết được vb trong excel mới mày mò để làm 1 chương trình cho riêng mình. Vừa làm vừa học thôi.

Còn phần database, em chỉ muốn đơn giản (phần 2 thôi). MaKH thì dùng trực tiếp tên luôn. còn phần báo cáo, thống kê chắc dùng pivot table.

Thực ra công việc của em là nhập nguyên liệu về rồi phân ra các xưởng gia công (ra sphẩm thô). Bước kế tiếp là gia công hoàn thiện rồi bán ra người tiêu dùng. Đương nhiên là nguyên liệu sau khi mua cho tới khi qua từng công đoạn gia công thì mình vẫn có thể bán (nguyên liệu, sp thô, sp hoàn thiện) nếu cảm thấy có lời và để thu hồi vốn càng nhanh càng tốt.

Mong chỉ bảo từ các bác! Cám ơn rất nhiều.
 
Upvote 0
Bạn đưa cả Code lên đây anh em sửa cho. Code của bạn chặt vứt đi già 1/2 vì quá thừa thao tác. Chẳng Paste hay Copy gì hết, gán (=) là xong.
 
Upvote 0
Mã:
Range("MSCOUNT").Select: XRecords = ActiveCell.Value ' tính số record mới nhập trong form
Range("Supplier").Select: XSupplier = ActiveCell.Value ' lưu tên nhà ccấp vào biến
ActiveCell.Offset(1, 0).Range("A1").Select: XDate = ActiveCell.Value ' lưu tên nhà ngày vào biến
Range("B6:G" & XRecords + 5).Select ' chọn dãy record mới thêm vào
Selection.Copy ' copy
 
Sheets("Data").Select ' chọn sheet dữ liệu
XDem = ActiveSheet.Range("TOTALRECORD").Value + 3 ' ktra đã có bao nhiêu record
ActiveSheet.Range("$A$" & XDem & ":$A$" & (XDem + XRecords - 1)).Value = XDate 'nhảy đến field đầu (ngày) của record mới, sau record cuối cùng, chọn bao, gán vào
ActiveSheet.Range("$B$" & XDem & ":$B$" & (XDem + XRecords - 1)).Value = XSupplier ' tương tự.
ActiveSheet.Range("C" & XDem).Select ' nhảy đến field kế tiếp.
ActiveSheet.Paste ' paste
ActiveSheet.Range("TOTALRECORD").Value = ActiveSheet.Range("TOTALRECORD").Value + XRecords ' cộng số vào tổng record.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Mình xem code của bạn rồi, thật khó dịch quá vì tham chiếu của bạn không phải theo địa chỉ ô mà lại theo Name nên không xác định được vị trí. Thôi thì thế này, bạn đưa file đó lên đây mình sẽ làm ngay cho bạn còn không thì bó tay rồi. Mong bạn thông cảm.
 
Upvote 0
Mình xem code của bạn rồi, thật khó dịch quá vì tham chiếu của bạn không phải theo địa chỉ ô mà lại theo Name nên không xác định được vị trí. Thôi thì thế này, bạn đưa file đó lên đây mình sẽ làm ngay cho bạn còn không thì bó tay rồi. Mong bạn thông cảm.

Em không import file được bác ơi. Nên em gửi file qua mail cho bác rồi. Nhờ giúp đỡ ạ.
Thanhks
 
Upvote 0
Toàn bộ Code của bạn sau điều chỉnh như sau (Code nhap bao gồm 3 phần: Kiểm tra - Nhập - Xoá Form):

Mã:
Private Sub XYARN_BUY_CLEAR_Click()
  intResponse = MsgBox("Chac an chua ?", vbYesNo + vbQuestion, "Are you OK?")
    If intResponse = vbNo Then
        Exit Sub
       End If
    Sheet4.[D2:D3] = "": Sheet4.[A6:G10].ClearContents
  Sheet4.[D2].Active
End Sub
'-------------------------------------------------------
Private Sub XYARN_BUY_SAVE_Click()
Dim dong As Integer, Clls As Range, i
With Sheet4
dong = WorksheetFunction.Max(.[A6:A10])
[COLOR=seagreen]'Code kiem tra khong bo trong du lieu[/COLOR]
If .[D2] = "" Then
MsgBox "Tai o D2 chua co du lieu."
.[D2].Active: Exit Sub
End If
If .[D3] = "" Then
MsgBox "Tai o D3 chua co du lieu."
.[D3].Active: Exit Sub
End If
For Each Clls In .Cells(6, 1).Resize(dong, 6)
If Clls = "" Then
MsgBox "Tai o " & Clls.Address & " chua co du lieu."
Clls.Activate: Exit Sub
End If: Next
[COLOR=green]'Code Nhap vao Data[/COLOR]
Set Clls = Sheet2.[A65536].End(xlUp).Offset(1)
Clls.Resize(dong).Value = .[D3].Value
Clls.Offset(, 1).Resize(dong).Value = .[D2].Value
Clls.Offset(, 2).Resize(dong, 6).Value = .[B6].Resize(dong, 6).Value
[COLOR=green]'Code reset Form[/COLOR]
.[D2:D3] = "":: .[A6:G10].ClearContents
.[D2].Active
    End With
End Sub
File mình gửi theo Email rồi
 
Lần chỉnh sửa cuối:
Upvote 0
Chưa kiểm tra. Bác tử tế quá, phản hồi liền.

Cám ơn bác nhiều.
 
Upvote 0
Toàn bộ Code của bạn sau điều chỉnh như sau (Code nhap bao gồm 3 phần: Kiểm tra - Nhập - Xoá Form):

Mã:
Private Sub XYARN_BUY_CLEAR_Click()
intResponse = MsgBox("Chac an chua ?", vbYesNo + vbQuestion, "Are you OK?")
If intResponse = vbNo Then
Exit Sub
End If
Sheet4.[D2:D3] = "": Sheet4.[A6:G10].ClearContents
Sheet4.[D2].Active
End Sub
'-------------------------------------------------------
Private Sub XYARN_BUY_SAVE_Click()
Dim dong As Integer, Clls As Range, i
With Sheet4
dong = WorksheetFunction.Max(.[A6:A10])
[COLOR=seagreen]'Code kiem tra khong bo trong du lieu[/COLOR]
If .[D2] = "" Then
MsgBox "Tai o D2 chua co du lieu."
.[D2].Active: Exit Sub
End If
If .[D3] = "" Then
MsgBox "Tai o D3 chua co du lieu."
.[D3].Active: Exit Sub
End If
For Each Clls In .Cells(6, 1).Resize(dong, 6)
If Clls = "" Then
MsgBox "Tai o " & Clls.Address & " chua co du lieu."
Clls.Activate: Exit Sub
End If: Next
[COLOR=green]'Code Nhap vao Data[/COLOR]
Set Clls = Sheet2.[A65536].End(xlUp).Offset(1) [COLOR="red"]'Bác vui lòng giải thích dòng này giúp em.[/COLOR]
Clls.Resize(dong).Value = .[D3].Value
Clls.Offset(, 1).Resize(dong).Value = .[D2].Value
Clls.Offset(, 2).Resize(dong, 6).Value = .[B6].Resize(dong, 6).Value
[COLOR=green]'Code reset Form[/COLOR]
.[D2:D3] = "":: .[A6:G10].ClearContents
.[D2].Active
End With
End Sub
File mình gửi theo Email rồi
1.Em hiểu gần hết đoạn code của bác. Tuyệt thật. chỉ có dòng em ghi chú màu đỏ là nhờ bác giải thích.

2. Em muốn dùng pivot để báo cáo tình hình của từng nhà cung cấp theo tháng, và sau đó có thể expand ra xem theo ngày, nhưng trong field em chỉ có ngày thôi thì em phải làm sao ạ?

Cám ơn.
 
Upvote 0
1/Set Clls = Sheet2.[A65536].End(xlUp).Offset(1). Giờ ta phân tích nhé

Sheet2.[A65536].End(xlUp): Đây là ô cuối cùng có dữ liệu trên cột A của Sheet Data.

Sheet2.[A65536].End(xlUp).Offset(1): Ô bên dưới ô có dữ liệu 1 dòng

Set Clls = Sheet2.[A65536].End(xlUp).Offset(1) Gan Clls là ô bên dưới ô cuối cùng có dữ liệu 1 ô.

2/Đơn giản nhất là thêm 1 cột sau cột ghi chú như cột I chẳng hạn đặt là cột Thang

Dùng công thức: I3=month(A3) rồi Filldown.

Đưa cột này vào Pivot là OK
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom