HỌC VBA NÊN BẮT ĐẦU TỪ ĐÂU?!

Liên hệ QC
... nhưng mình chỉ muốn có thông tin về chủ đề mình đăng, còn những thứ ngoài lề thì xin đừng bàn nữa, mình cảm ơn
Theo luật diễn đàn, bạn có quyền mách lên ban quản trị để ngừoi ta xoá (hoặc chém chặt) hết những câu trả lời ngoài lề.

Trước mắt thì tôi theo nguyên tắc không cần phải trả lời riêng cho bạn. Tôi trả lời cho những người khác trên diễn đàn.
Và những điều tôi chỉ dẫn thì tôi cũng có nói rõ rằng chúng là cái căn bản của lập trình.
Khi học toán giải tích, có những người chỉ cốt thuộc công thức tính đạo hàm. Tôi thì khác, toi bắt ngừoi học phải hiểu rằng "đạo hàm là giới hạn của dy/dx khi dx tiến về 0".
Nếu ban quản trị đồng ý với bạn rằng chỉ dẫn kiểu như vậy là lạc đề thì đó là ý ban quản trị, không phải của bạn.
 
Theo luật diễn đàn, bạn có quyền mách lên ban quản trị để ngừoi ta xoá (hoặc chém chặt) hết những câu trả lời ngoài lề.

Trước mắt thì tôi theo nguyên tắc không cần phải trả lời riêng cho bạn. Tôi trả lời cho những người khác trên diễn đàn.
Và những điều tôi chỉ dẫn thì tôi cũng có nói rõ rằng chúng là cái căn bản của lập trình.
Khi học toán giải tích, có những người chỉ cốt thuộc công thức tính đạo hàm. Tôi thì khác, toi bắt ngừoi học phải hiểu rằng "đạo hàm là giới hạn của dy/dx khi dx tiến về 0".
Nếu ban quản trị đồng ý với bạn rằng chỉ dẫn kiểu như vậy là lạc đề thì đó là ý ban quản trị, không phải của bạn.
vậy em xin lỗi anh chị vì đã làm phiền, có vẻ đây không phải nơi dành cho người mới bắt đầu, em đã sai ngay từ lúc đặt câu hỏi, em nghỉ mình sẽ tìm hiểu thêm trước khi có câu hỏi khác, cảm ơn mọi người nhiều ạ :)
 
mình đi làm rồi, và cũng reco một vài macro đơn giản để phục vụ công việc của mình, nên giờ mình cần biết mình nên bắt đầu từ đâu thay vì cứ băng ngang như lúc trước, nhưng mà thực sự từ lúc đăng bài mình có cảm giác rất ít bạn thực sự có tâm giúp mình bằng cách chia sẻ thông tin hay kinh nghiệm, chỉ chia sẻ những cái ngoài lề, mình biết nó khó, vì khó nên mình mới hỏi và cần sự giúp đỡ của mọi người nếu dễ mình đã không đăng bài để hỏi, mong mọi người nói thẳng vào vấn đề giúp mình, cảm ơn
Theo ý kiến chủ quan của tôi, nếu bạn thực sự muốn học lập trình VBA, thì bạn cần theo học 1 lớp VBA cơ bản.
Ở đó bạn được các thầy sẽ dạy cho bạn những kiến thức cơ bản đầu tiên. Khi bạn có những thứ cơ bản đó rồi, bạn có thể tự học, tự nghiên cứu, tự vọc.
Tuy nhiên bạn cần phải có thêm niềm đam mê yêu thích nó nữa. Ngay chính bản thân tôi, tôi cũng đi theo hướng này.
Và tất cả những việc tôi đang làm ở cơ quan, đều dùng VBA.
Chúc bạn thành công!
 
Theo ý kiến chủ quan của tôi, nếu bạn thực sự muốn học lập trình VBA, thì bạn cần theo học 1 lớp VBA cơ bản.
Ở đó bạn được các thầy sẽ dạy cho bạn những kiến thức cơ bản đầu tiên. Khi bạn có những thứ cơ bản đó rồi, bạn có thể tự học, tự nghiên cứu, tự vọc.
Tuy nhiên bạn cần phải có thêm niềm đam mê yêu thích nó nữa. Ngay chính bản thân tôi, tôi cũng đi theo hướng này.
Và tất cả những việc tôi đang làm ở cơ quan, đều dùng VBA.
Chúc bạn thành công!
cám ơn bạn :)
 
Thay mặt BQT của diễn đàn giaiphapexcel.com (GPE), tôi đã xóa những bài viết mà tôi cho là nhạy cảm, dễ gây hiểu nhầm, mất đoàn kết, không trả lời đúng trọng tâm.
Các bạn hãy cùng nhau chung tay xây dựng vì một diễn đàn tốt đẹp nhé.

Hoàng Trọng Nghĩa.
 
Bắt đầu từ các kiến thức cơ bản
Hãy tự làm các ví dụ đơn giản , bài tập cơ bản ... không hiểu thì hỏi bạn hỏi thầy, hỏi trên internet
 
1. Thuật toán.
Muốn giải quyết một vấn đề bất kỳ thì phải tìm ra được hướng đi, tìm ra thuật toán. Thuật toán là thuật toán, nó chả phụ thuộc vào VBA, Delphi hay bất cứ ngôn ngữ lập trình nào. VBA, Delphi hay các môi trường lập trình khác chỉ là công cụ để bạn thực hiện cái thuật toán đã nghĩ ra của mình. Để có thuật toán thì phải phân tích vấn đề, tư duy. Có 1 vấn đề nhưng rất có thể 100 có 100 thuật toán khác nhau. Người ta tư duy tốt, có bề dày kinh nghiệm thì có thể người ta nghĩ ra thuật toán tốt, ngắn gọn. Mình tư duy kém hơn, chưa có kinh nghiệm thì thuật toán của mình kém hơn, có thể đi vòng vèo hơn. Thế thôi.
Tôi cho một vd. không dính dáng gì tới bảng tính. Giả sử bạn có chuỗi 11 chữ số. Bạn muốn biết số đó có 4 chữ số cuối dạng ABAB (số đẹp?) hay không. Tôi nghĩ: đơn giản quá, chỉ cần "cắt" ra ký tự 1, 2, 3 và 4 tính từ cuối rồi làm 2 phép so sánh - 1 và 3, 2 và 4. Nếu 1 = 3 và 2 = 4 thì số cho trước có dạng x..xABAB. Thế thôi. Nhưng bạn đam mê Toán và bạn biết là một số có 4 chữ số sẽ có dạng ABAB khi và chỉ khi chia hết cho 101. Do vậy bạn nghĩ ra thuật toán: "cắt" ra từ cuối chuỗi có 4 ký tự và nhập vào biến số k, vd. nhập vào biến Long. Sau đó kiểm tra xem k có chia hết cho 101 không. Nếu chia hết thì chuỗi ban đầu có dạng x...xABAB, ngược lại thì không có dạng đó.

Thường cái khó là nghĩ ra hướng đi, tìm ra được thuật toán.
Cho dù bạn lập công thức trân sheet hay viết code VBA thì bạn cũng phải tìm ra hướng đi, nghĩ ra được thuật toán. Bước tiếp theo là tìm xem có những hàm nào giúp bạn thực hiện các bước của thuật toán đó. Thế thôi. Khác nhau chỉ là ở chỗ người ta nghĩ ra thuật toán hay và công thức của người ta ngắn gọn, còn của mình thì không "đẹp" như thế.

2. Khai báo biến, các cấu trúc dữ liệu, các cấu trúc của ngôn ngữ.
Trong lập trình VBA thì thường có những kết quả trung gian, và cần phải nhớ những kết quả đó để sử dụng về sau. Các biến chính là dùng để nhớ các kết quả trung gian. Nhưng nhiều khi có nhiều giá trị cần nhớ để dùng về sau và cách lôgíc duy nhất là nhớ chúng trong một cấu trúc dữ liệu gọi là "mảng" thay vì nhớ trong các biến đơn giản rời rạc. Lúc đó việc truy cập tới các giá trị rất đơn giản. Vậy thì bước đầu tiên là học về cơ bản: có những kiểu dữ liệu gì, cách khai báo biến. Cách khai báo mảng và truy cập tới từng thành phần của mảng.

Cơ bản còn là các cấu trúc của ngôn ngữ. Giả sử có bài toán: Hãy tô mầu các ô có giá trị 5 trong vùng A1:C2. Thuật toán mà ai cũng nghĩ ra là: Đọc ra lần lượt A1, B1, C1, A2, B2, C2 và kiểm tra xem có = 5 không. Nhưng nếu có vùng khủng A1:Z100 thì sao? Dùng thuật toán trên cũng được nhưng code sẽ dài lê thê. Còn nếu chưa biết trước số dòng và cột thì thuật toán bó tay. Nhưng nếu trước đó bạn đã tìm hiểu và biết VBA có cấu trúc FOR và bạn hiểu được triết lý của nó thì ở thời điểm này bạn sẽ nghĩ ra thuật toán khác: "Dò" từng dòng của vùng dữ liệu, và với mỗi dòng thì "dò" từng cột, và đọc ra giá trị của ô ở dòng và cột đang "dò". Như thế code sẽ ngắn gọn và luôn chỉ ngắn như thế dù số dòng cột có là bao nhiêu. Chính vì thế mà bước 1 là phải tìm hiểu cơ bản: VBA có những cấu trúc nào. Những cấu trúc ở đây là FOR, DO ... LOOP, IF ... THEN, SELECT CASE ... Biết được chúng thì trong giai đoạn tìm thuật toán mới có thể "nghĩ" ra thuật toán hợp lý.
Ngoài ra còn phải tìm hiểu xem VBA có những hàm gì.
Muốn làm bất cứ việc gì thì bước đầu tiên khi đầu quân cho một xưởng là phải biết trong xưởng có công cụ gì, cách hoạt động của chúng. Vì thế điểm 2 này là bài học đầu tiên.

3. Lập trình đối tượng.
Lập trình tương tác với bảng tính chẳng qua là lập trình đối tượng. Nói nôm na là phải truy cập được tới đối tượng cần quan tâm rồi sau đó gọi các phương thức của nó, hoặc đọc / thiết lập các thuộc tính của đối tượng đó. Thế thôi và chỉ thế thôi.

Trong Excel VBA thì mỗi tập tin là một đối tượng WorkBook. Trong mỗi tập tin thì mỗi sheet là một đối tượng WorkSheet. Trong mỗi sheet thì mỗi vùng (một hay nhiều ô) là một đối tượng Range. Trong mỗi Range thì vd. thuộc tính Font là đối tượng. Hiểu được, hình dung được "cấu trúc" của tập tin về mặt đối tượng thì sẽ dễ dàng truy cập tới bất cứ đối tượng nào.

Như tôi đã viết thì mọi việc chỉ là truy cập được tới đối tượng cần quan tâm rồi gọi phương thức, thuộc tính của nó. Vậy làm thế nào để truy cập được tới đối tượng bất kỳ?

Khi kích hoạt Excel và vào VBE để viết code thì bạn luôn có 1 đối tượng gọi là Application. Nó như là cái gốc. Muốn truy cập tới đối tượng này thì chỉ cần viết Application. Nhưng Application có nhiều phương thức và thuộc tính. Vd. thuộc tính WorkBooks - là đối tượng "quản lý" các tập tin hiện đang mở trong Excel. Như vậy truy cập tới đối tượng này là Application.WorkBooks. Nhưng làm cách nào để truy cập tới tập tin cụ thể trong số các tập tin đang mở?

Đối tượng Workbooks có tuộc tính Item dùng để truy cập tới từng tập tin. Có 2 cách là dùng chỉ số và dùng tên tập tin:
Mã:
Application.Workbooks.Item(1) là truy cập tới tập tin 1
Application.Workbooks.Item("copyfile.xlsm") là truy cập tới tập tin "copyfile.xlsm"

Cũng có thể viết ngắn gọn
Mã:
Application.Workbooks(1) là truy cập tới tập tin 1
Application.Workbooks("copyfile.xlsm") là truy cập tới tập tin "copyfile.xlsm"
Application có thể bỏ và code sẽ ngắn như sau - có ghi nhớ đối tượng vào biến wb (As WorkBook) để sau đó dùng
Mã:
Set wb = Workbooks(1)
Set wb = Workbooks("copyfile.xlsm")

ThisWorkbook là đối tượng (kiểu Workbook) đại diện cho tập tin mà trong đó có code hiện hành.

Thế có đối tượng tập tin (workbook) cụ thể rồi thì làm thế nào truy cập tới từng sheet cụ thể? Ở đây cũng tương tự, tức đối tượng Workbook có thuộc tính là đối tượng Worksheets và các cách truy cập
Mã:
Dim sh As Worksheet
    Set sh = Workbooks(1).Worksheets.Item(1)                                   ' toi sheet 1
    Set sh = Workbooks(1).Worksheets(1)                                           ' toi sheet 1
    Set sh = Workbooks(1).Worksheets.Item("Sheet1")                        ' toi sheet  Sheet1
    Set sh = Workbooks(1).Worksheets("Sheet1")                                ' toi sheet  Sheet1
    Set sh = Workbooks("copyfile.xlsm").Worksheets.Item(1)               ' toi sheet 1
    Set sh = Workbooks("copyfile.xlsm").Worksheets(1)                       ' toi sheet 1
    Set sh = Workbooks("copyfile.xlsm").Worksheets.Item("Sheet1")    ' toi sheet  Sheet1
    Set sh = Workbooks("copyfile.xlsm").Worksheets("Sheet1")            ' toi sheet  Sheet1

Thế có sheet cụ thể trong tập tin cụ thể thì làm thế nào truy cập tới từng vùng trên sheet đó? Đối tượng Worksheet lại có thuộc tính Range - cũng là đối tượng. Vd. truy cập tới Range
Mã:
Dim rng As Range
    Set rng = Workbooks("copyfile.xlsm").Worksheets("Sheet1").Range("C2")            ' la truy cap toi o C2 tren Sheet1 trong tap tin copyfile.xlsm
Range lại có thuộc tính Font - cũng là đối tượng.

Vậy thì nếu có bài toán: "Hãy tô đậm và cho mầu đỏ ô C2 trên Sheet1 của tập tin copyfile.xlsm", thì chỉ cần truy cập tới đối tượng Font của ô C2 trên Sheet1 của tập tin copyfile.xlsm rồi thiết lập thuộc tính Bold và Color của đối tượng Font thôi
Mã:
Sub he()
Dim FontObj As Font
    Set FontObj = Workbooks("copyfile.xlsm").Worksheets("Sheet1").Range("C2").Font
    With FontObj
        .Bold = True
        .Color = RGB(255, 0, 0)
    End With
End Sub

Nhưng bản thân truy cập Workbooks("copyfile.xlsm").Worksheets("Sheet1").Range("C2").Font đã trả về đối tượng Font rồi nên cũng có thể không dùng biến FontObj
Mã:
Sub he()
    With Workbooks("copyfile.xlsm").Worksheets("Sheet1").Range("C2").Font
        .Bold = True
        .Color = RGB(255, 0, 0)
    End With
End Sub

Tóm lại lập trình tương tác với bảng tính chẳng qua là truy cập tới đối tượng cần thiết rồi gọi phương thức của nó, đọc ra hoặc thiết lập các thuộc tính của nó. Chả có gì là cao siêu cả.

Nói ngắn gọn thì trước hết phải đọc và hiểu điểm 2. Hiểu được cấu trúc của tập tin ở điểm 3. Nhưng đọc 2 và 3 ở đâu? Nguồn có thể là sách, các khóa học. Nhưng đấy là thời xưa. Thời nay thì kho kiến thức chính là Internet. Dù khóa học có dài bao nhiêu thì cũng không bằng kho kiến thức Internet. Nhưng về điểm 2 và 3 bạn cũng có thể đọc ngay trong VBE: Alt + F11 -> menu View -> Object Browser. Ở ListBox trái bạn có các lớp. Vd. bạn click vào Application thì ở ListBox phải bạn có các phương thức và thuộc tính của đối tượng Application. Giả sử bạn click vào thuộc tính Workbooks rồi nhấn F1 thì bạn sẽ thấy có giải thích, ví dụ về cách truy cập, cách dùng v...v
Ở dưới 2 ListBox bạn nhìn thấy dòng Property Workbooks As Workbooks
. Bạn click vào Workbooks ở dòng này thì thấy Workbooks ở ListBox trái được chọn và ở ListBox phải bạn có các phương thức và thuộc tính của đối tượng Workbooks. Bạn click vào thuộc tính Item rồi nhấn F1 ... Cứ như thế tới khi mỏi tay, mắt đau, đọc thấy ớn thì thôi.

Cần gì tìm đâu xa xôi. Ngay trong VBE bạn có một kho kiến thức. Muốn viết code, muốn hiểu được code của người khác, vd. lấy từ trên mạng về, thì phải có cơ bản điểm 2 và 3. Vài buổi học offline chả là cái gì cả. Cái mấu chốt là phải hiểu được cấu trúc của bảng tính về mặt đối tượng, hiểu và sử dụng thuần thục các cấu trúc của VBA. Còn thuật toán hay và ngắn gọn tới mức nào là tùy thuộc vào khả năng mỗi người. Nó như học Toán ấy. Không phải cứ cần cù là giỏi Toán.
 
Cám ơn những chia sẻ quý báu của Thầy!
 
1. Thuật toán.
Muốn giải quyết một vấn đề bất kỳ thì phải tìm ra được hướng đi, tìm ra thuật toán. Thuật toán là thuật toán, nó chả phụ thuộc vào VBA, Delphi hay bất cứ ngôn ngữ lập trình nào. VBA, Delphi hay các môi trường lập trình khác chỉ là công cụ để bạn thực hiện cái thuật toán đã nghĩ ra của mình. Để có thuật toán thì phải phân tích vấn đề, tư duy. Có 1 vấn đề nhưng rất có thể 100 có 100 thuật toán khác nhau. Người ta tư duy tốt, có bề dày kinh nghiệm thì có thể người ta nghĩ ra thuật toán tốt, ngắn gọn. Mình tư duy kém hơn, chưa có kinh nghiệm thì thuật toán của mình kém hơn, có thể đi vòng vèo hơn. Thế thôi.
Tôi cho một vd. không dính dáng gì tới bảng tính. Giả sử bạn có chuỗi 11 chữ số. Bạn muốn biết số đó có 4 chữ số cuối dạng ABAB (số đẹp?) hay không. Tôi nghĩ: đơn giản quá, chỉ cần "cắt" ra ký tự 1, 2, 3 và 4 tính từ cuối rồi làm 2 phép so sánh - 1 và 3, 2 và 4. Nếu 1 = 3 và 2 = 4 thì số cho trước có dạng x..xABAB. Thế thôi. Nhưng bạn đam mê Toán và bạn biết là một số có 4 chữ số sẽ có dạng ABAB khi và chỉ khi chia hết cho 101. Do vậy bạn nghĩ ra thuật toán: "cắt" ra từ cuối chuỗi có 4 ký tự và nhập vào biến số k, vd. nhập vào biến Long. Sau đó kiểm tra xem k có chia hết cho 101 không. Nếu chia hết thì chuỗi ban đầu có dạng x...xABAB, ngược lại thì không có dạng đó.

Thường cái khó là nghĩ ra hướng đi, tìm ra được thuật toán.
Cho dù bạn lập công thức trân sheet hay viết code VBA thì bạn cũng phải tìm ra hướng đi, nghĩ ra được thuật toán. Bước tiếp theo là tìm xem có những hàm nào giúp bạn thực hiện các bước của thuật toán đó. Thế thôi. Khác nhau chỉ là ở chỗ người ta nghĩ ra thuật toán hay và công thức của người ta ngắn gọn, còn của mình thì không "đẹp" như thế.

2. Khai báo biến, các cấu trúc dữ liệu, các cấu trúc của ngôn ngữ.
Trong lập trình VBA thì thường có những kết quả trung gian, và cần phải nhớ những kết quả đó để sử dụng về sau. Các biến chính là dùng để nhớ các kết quả trung gian. Nhưng nhiều khi có nhiều giá trị cần nhớ để dùng về sau và cách lôgíc duy nhất là nhớ chúng trong một cấu trúc dữ liệu gọi là "mảng" thay vì nhớ trong các biến đơn giản rời rạc. Lúc đó việc truy cập tới các giá trị rất đơn giản. Vậy thì bước đầu tiên là học về cơ bản: có những kiểu dữ liệu gì, cách khai báo biến. Cách khai báo mảng và truy cập tới từng thành phần của mảng.

Cơ bản còn là các cấu trúc của ngôn ngữ. Giả sử có bài toán: Hãy tô mầu các ô có giá trị 5 trong vùng A1:C2. Thuật toán mà ai cũng nghĩ ra là: Đọc ra lần lượt A1, B1, C1, A2, B2, C2 và kiểm tra xem có = 5 không. Nhưng nếu có vùng khủng A1:Z100 thì sao? Dùng thuật toán trên cũng được nhưng code sẽ dài lê thê. Còn nếu chưa biết trước số dòng và cột thì thuật toán bó tay. Nhưng nếu trước đó bạn đã tìm hiểu và biết VBA có cấu trúc FOR và bạn hiểu được triết lý của nó thì ở thời điểm này bạn sẽ nghĩ ra thuật toán khác: "Dò" từng dòng của vùng dữ liệu, và với mỗi dòng thì "dò" từng cột, và đọc ra giá trị của ô ở dòng và cột đang "dò". Như thế code sẽ ngắn gọn và luôn chỉ ngắn như thế dù số dòng cột có là bao nhiêu. Chính vì thế mà bước 1 là phải tìm hiểu cơ bản: VBA có những cấu trúc nào. Những cấu trúc ở đây là FOR, DO ... LOOP, IF ... THEN, SELECT CASE ... Biết được chúng thì trong giai đoạn tìm thuật toán mới có thể "nghĩ" ra thuật toán hợp lý.
Ngoài ra còn phải tìm hiểu xem VBA có những hàm gì.
Muốn làm bất cứ việc gì thì bước đầu tiên khi đầu quân cho một xưởng là phải biết trong xưởng có công cụ gì, cách hoạt động của chúng. Vì thế điểm 2 này là bài học đầu tiên.

3. Lập trình đối tượng.
Lập trình tương tác với bảng tính chẳng qua là lập trình đối tượng. Nói nôm na là phải truy cập được tới đối tượng cần quan tâm rồi sau đó gọi các phương thức của nó, hoặc đọc / thiết lập các thuộc tính của đối tượng đó. Thế thôi và chỉ thế thôi.

Trong Excel VBA thì mỗi tập tin là một đối tượng WorkBook. Trong mỗi tập tin thì mỗi sheet là một đối tượng WorkSheet. Trong mỗi sheet thì mỗi vùng (một hay nhiều ô) là một đối tượng Range. Trong mỗi Range thì vd. thuộc tính Font là đối tượng. Hiểu được, hình dung được "cấu trúc" của tập tin về mặt đối tượng thì sẽ dễ dàng truy cập tới bất cứ đối tượng nào.

Như tôi đã viết thì mọi việc chỉ là truy cập được tới đối tượng cần quan tâm rồi gọi phương thức, thuộc tính của nó. Vậy làm thế nào để truy cập được tới đối tượng bất kỳ?

Khi kích hoạt Excel và vào VBE để viết code thì bạn luôn có 1 đối tượng gọi là Application. Nó như là cái gốc. Muốn truy cập tới đối tượng này thì chỉ cần viết Application. Nhưng Application có nhiều phương thức và thuộc tính. Vd. thuộc tính WorkBooks - là đối tượng "quản lý" các tập tin hiện đang mở trong Excel. Như vậy truy cập tới đối tượng này là Application.WorkBooks. Nhưng làm cách nào để truy cập tới tập tin cụ thể trong số các tập tin đang mở?

Đối tượng Workbooks có tuộc tính Item dùng để truy cập tới từng tập tin. Có 2 cách là dùng chỉ số và dùng tên tập tin:
Mã:
Application.Workbooks.Item(1) là truy cập tới tập tin 1
Application.Workbooks.Item("copyfile.xlsm") là truy cập tới tập tin "copyfile.xlsm"

Cũng có thể viết ngắn gọn
Mã:
Application.Workbooks(1) là truy cập tới tập tin 1
Application.Workbooks("copyfile.xlsm") là truy cập tới tập tin "copyfile.xlsm"
Application có thể bỏ và code sẽ ngắn như sau - có ghi nhớ đối tượng vào biến wb (As WorkBook) để sau đó dùng
Mã:
Set wb = Workbooks(1)
Set wb = Workbooks("copyfile.xlsm")

ThisWorkbook là đối tượng (kiểu Workbook) đại diện cho tập tin mà trong đó có code hiện hành.

Thế có đối tượng tập tin (workbook) cụ thể rồi thì làm thế nào truy cập tới từng sheet cụ thể? Ở đây cũng tương tự, tức đối tượng Workbook có thuộc tính là đối tượng Worksheets và các cách truy cập
Mã:
Dim sh As Worksheet
    Set sh = Workbooks(1).Worksheets.Item(1)                                   ' toi sheet 1
    Set sh = Workbooks(1).Worksheets(1)                                           ' toi sheet 1
    Set sh = Workbooks(1).Worksheets.Item("Sheet1")                        ' toi sheet  Sheet1
    Set sh = Workbooks(1).Worksheets("Sheet1")                                ' toi sheet  Sheet1
    Set sh = Workbooks("copyfile.xlsm").Worksheets.Item(1)               ' toi sheet 1
    Set sh = Workbooks("copyfile.xlsm").Worksheets(1)                       ' toi sheet 1
    Set sh = Workbooks("copyfile.xlsm").Worksheets.Item("Sheet1")    ' toi sheet  Sheet1
    Set sh = Workbooks("copyfile.xlsm").Worksheets("Sheet1")            ' toi sheet  Sheet1

Thế có sheet cụ thể trong tập tin cụ thể thì làm thế nào truy cập tới từng vùng trên sheet đó? Đối tượng Worksheet lại có thuộc tính Range - cũng là đối tượng. Vd. truy cập tới Range
Mã:
Dim rng As Range
    Set rng = Workbooks("copyfile.xlsm").Worksheets("Sheet1").Range("C2")            ' la truy cap toi o C2 tren Sheet1 trong tap tin copyfile.xlsm
Range lại có thuộc tính Font - cũng là đối tượng.

Vậy thì nếu có bài toán: "Hãy tô đậm và cho mầu đỏ ô C2 trên Sheet1 của tập tin copyfile.xlsm", thì chỉ cần truy cập tới đối tượng Font của ô C2 trên Sheet1 của tập tin copyfile.xlsm rồi thiết lập thuộc tính Bold và Color của đối tượng Font thôi
Mã:
Sub he()
Dim FontObj As Font
    Set FontObj = Workbooks("copyfile.xlsm").Worksheets("Sheet1").Range("C2").Font
    With FontObj
        .Bold = True
        .Color = RGB(255, 0, 0)
    End With
End Sub

Nhưng bản thân truy cập Workbooks("copyfile.xlsm").Worksheets("Sheet1").Range("C2").Font đã trả về đối tượng Font rồi nên cũng có thể không dùng biến FontObj
Mã:
Sub he()
    With Workbooks("copyfile.xlsm").Worksheets("Sheet1").Range("C2").Font
        .Bold = True
        .Color = RGB(255, 0, 0)
    End With
End Sub

Tóm lại lập trình tương tác với bảng tính chẳng qua là truy cập tới đối tượng cần thiết rồi gọi phương thức của nó, đọc ra hoặc thiết lập các thuộc tính của nó. Chả có gì là cao siêu cả.

Nói ngắn gọn thì trước hết phải đọc và hiểu điểm 2. Hiểu được cấu trúc của tập tin ở điểm 3. Nhưng đọc 2 và 3 ở đâu? Nguồn có thể là sách, các khóa học. Nhưng đấy là thời xưa. Thời nay thì kho kiến thức chính là Internet. Dù khóa học có dài bao nhiêu thì cũng không bằng kho kiến thức Internet. Nhưng về điểm 2 và 3 bạn cũng có thể đọc ngay trong VBE: Alt + F11 -> menu View -> Object Browser. Ở ListBox trái bạn có các lớp. Vd. bạn click vào Application thì ở ListBox phải bạn có các phương thức và thuộc tính của đối tượng Application. Giả sử bạn click vào thuộc tính Workbooks rồi nhấn F1 thì bạn sẽ thấy có giải thích, ví dụ về cách truy cập, cách dùng v...v
Ở dưới 2 ListBox bạn nhìn thấy dòng Property Workbooks As Workbooks
. Bạn click vào Workbooks ở dòng này thì thấy Workbooks ở ListBox trái được chọn và ở ListBox phải bạn có các phương thức và thuộc tính của đối tượng Workbooks. Bạn click vào thuộc tính Item rồi nhấn F1 ... Cứ như thế tới khi mỏi tay, mắt đau, đọc thấy ớn thì thôi.

Cần gì tìm đâu xa xôi. Ngay trong VBE bạn có một kho kiến thức. Muốn viết code, muốn hiểu được code của người khác, vd. lấy từ trên mạng về, thì phải có cơ bản điểm 2 và 3. Vài buổi học offline chả là cái gì cả. Cái mấu chốt là phải hiểu được cấu trúc của bảng tính về mặt đối tượng, hiểu và sử dụng thuần thục các cấu trúc của VBA. Còn thuật toán hay và ngắn gọn tới mức nào là tùy thuộc vào khả năng mỗi người. Nó như học Toán ấy. Không phải cứ cần cù là giỏi Toán.
Em rất cảm ơn những chia sẻ của thầy ạ!
 
Hôm Mạnh coi Tivi thấy nhỏ dẫn chương trình hỏi tay lập trình viên thế nào là thuật toán trả lời như sau:

Nói đơn giản vầy cho chị hiểu cùng một vấn người ta viết code xử lý ra cái kết quả đó mất 10 phút ... còn người khác có thuật toán tốt viết code xử lý vấn đề đó mất 5 giây ...vậy sự khác nhau về cách xử lý vấn đề đó trong code gọi là thuật toán

Hông biết hắn nói vậy trúng hay trật he ===\. ................ khơi nguồn cho học tập 1 chút _+)(9_)()(-
 
Lần chỉnh sửa cuối:
Hôm Mạnh coi Tivi thấy nhỏ dẫn chương trình hỏi tay lập trình viên thế nào là thuật toán trả lời như sau:

Nói đơn giản vầy cho chị hiểu cùng một vấn về người ta viết code xử lý ra cái kết quả đó mất 10 phút ... còn người khác có thuật toán tốt viết code xử lý vấn đề đó mất 5 giây ...vậy sự khác nhau về cách xử lý vấn đề đó trong code gọi là thuật toán

Hông biết hắn nói vậy trúng hay trật he ===\.
Hình như có cái gì đó ngượng ngượng thì phải.
thuật toán được hiểu nôn na kiểu nông dân là như thế này. thuật toán là tập hợp các bước làm, được sắp theo 1 thứ tự nhất định, và khi thực hiện các bước làm đó thì ta sẽ ra kết quả mong muốn từ dữ liệu đầu vào
ví dụ như việc nấu cơm, chúng ta cần phải thao tác những bước như sau, lấy xoong, bỏ gạo vào xoong, vo gạo và bắt liên bếp, bật điện và nấu.
thế là sản phẩm cuối cùng là cơm
 
Lần chỉnh sửa cuối:
Hình như có cái gì đó ngượng ngượng thì phải.
thuật toán được hiểu nôn na kiểu nông dân là như thế này. thuật toán là tập hợp các bước làm, được sắp theo 1 thứ tự nhất định, và khi thực hiện các bước làm đó thì ta sẽ ra kết quả mong muốn từ dữ liệu đầu vào
ví dụ như việc nấu cơm, chúng ta cần phải thao tác những bước như sau, lấy xoong, bỏ gạo vào xoong, vo gạo và bắt liên bếp, bật điện và nấu.
thế là sản phẩm cuối cùng là cơm
còn có nồi nấu 2 tiếng hay 10 tiếng đó là giải thuật để giải quyết vấn đề đó chứ không phải là thuật toán

Mạnh thấy hắn nói vậy nói lại thui chứ ko biết chi hết ... Nhưng có 1 cái mạnh biết thớt này tới lúc có nhiều bài vui vẻ rồi đó .......... biết mà-0-0-0-
 
Hôm Mạnh coi Tivi thấy nhỏ dẫn chương trình hỏi tay lập trình viên thế nào là thuật toán trả lời như sau:

Nói đơn giản vầy cho chị hiểu cùng một vấn người ta viết code xử lý ra cái kết quả đó mất 10 phút ... còn người khác có thuật toán tốt viết code xử lý vấn đề đó mất 5 giây ...vậy sự khác nhau về cách xử lý vấn đề đó trong code gọi là thuật toán

Hông biết hắn nói vậy trúng hay trật he ===\. ................ khơi nguồn cho học tập 1 chút _+)(9_)()(-
Tôi trả lời bạn dựa trên cái câu "cho học tập một chút"

Cái mà người kia nói là thuật toán loại cao cấp. Thú thật, cỡ này chính tôi cũng chưa học tới.
Dùng ví dụ điển hình, bạn nhân một số 12345 cho 5:
1. Ngừoi quen dùng tính nhẩm có thể làm con toán nhân này, khong cần mẹo gì
2. Với cái kiến thức "5 tức là 10 chia 2, và nhân 10 có nghĩa là cộng thêm 1 số 0", người quen tính nhẩm có thể áp dụng
Như vậy, thuật toán 2 tốt hơn 1. Để có thể làm như vậy, bạn phải thêm 1 kiến thức (5x2 = 10)
Có cái gì chưa ổn?
Thực ra, để sử dụng kiến thức 5x2=10 bạn còn phải dựa trên các đinh luật toán sau:
(1) nếu a1=b1*c1 và c2=c1*d1 thì a1=b1*c2/d1; luật này thì dễ hiểu rồi
(2) luật thứ hai hơi sâu 1 chút, chúng ta ít khi học tới là vì nó được hiểu ngầm
- cách diễn tả số trong toán số thường ngày của ta là cách diễn tả của hệ thống thập phân. Theo cách diễn tả này thì con toán nhân 10^n chỉ giản dị là dời cả nhóm số về bên trái n đơn vị. Như vậy, con toán nhân 10 là con toán rất dễ thực hiện tính nhẩm!

Thuật toán cao cấp thuộc về toán cao cấp. Nó chỉ giành cho những người thực sự muốn học về lập trình giải tích số (numerical analysis) và lập trình trí tuệ nhân tạo (artificial intelligence). Những thuật toán này thường độc lập với ngôn ngữ và môi trường.

Nói xong phần cao cấp, bây giờ đến phần mới bắt đầu:
Hiện nay, cái thuật toán hầu hết dựa trên kinh nghiệm. Làm quen rồi thì bạn tự động biết cách A hiệu quả hơn cách B. Đó là lý do tại sao tôi nói cứ cắm cúi làm một thời gian tự động sẽ quen.
Tuy nhiên, từ quen đến giỏi cần phải có đầu óc cởi mở để tiếp thu những cái thủ thuật mẹo của người khác. Những thủ thuật mẹo này chính là cái mà tôi gọi là thuật toán ứng dụng. Những thuật toán này thường đi sát với môi trường.

VBA là công cụ của Access được du nhập vào Excel. Về sau này thực sự được sử dụng ở Excel nhiều hơn bởi vì Excel đã chiếm được ngôi vị độc tôn trong bảng tính (mãi gần đây mới bị Google Sheets cạnh tranh) trong khi Access bị các phần mềm CSDL khác nện tơi tả. Vì vậy học VBA cũng đồng thời phải học cách sử dụng giao diện với bảng tính - tức là các đối tượng của bảng tính. Một số tiện nghi khác trên nền tảng Windows cũng sẽ được sử dụng, điển hình là các đối tượng của VBScript như Dictionary, Regexp... Bên CSDL thì có ADO...

Lập trình tới một mức độ nào đó, bạn bắt buộc phải chấp nhận rằng tự mình không đủ thì giờ để viết tất cả những chức năng cần thiết. Và bạn phải học qua cách sử dụng những gì được người khác cung cấp sẵn. Điển hình là khi bạn thấy người ta sử dụng các đối tượng của Windows qua API

Các ngôn ngữ tổng quát hơn có thư viện riêng của chúng. Điển hình C# có dot net, C++ có STL, Java có Beans, JavaScript có JQuery, JSON...
 
... Còn thuật toán hay và ngắn gọn tới mức nào là tùy thuộc vào khả năng mỗi người. Nó như học Toán ấy. Không phải cứ cần cù là giỏi Toán.
Cái mức "giỏi" mà bác nói ở đây nó tương đối cao. Hầu hết các lập trình viên không cần phải đạt đén mức này. Và trên thực tế là chỉ có một số ít.

Cái từ "giỏi" mà tôi dùng nó thấp hơn. Nhưng đủ để giải quyết hầu hết các vấn đề. Vì vậy tôi rất tự tin khi tuyên bố rằng chỉ cần siêng năng là tập được.

Trước đây tôi có dùng ví dụ kiếm chiêu và kiếm quyết. Cái mức độ kiếm chiêu chỉ cần siêng năng. Cái mức độ kiếm quyết phải cần mở rộng đầu óc quan sát. Cái điểm "thông minh" mà bác đòi hỏi chỉ dùng trong trường hợp muốn vượt hơn "thầy" - thanh xuất ư lam nhi thanh ư lam.
 
Tôi trả lời bạn dựa trên cái câu "cho học tập một chút"

Cái mà người kia nói là thuật toán loại cao cấp. Thú thật, cỡ này chính tôi cũng chưa học tới.
Dùng ví dụ điển hình, bạn nhân một số 12345 cho 5:
1. Ngừoi quen dùng tính nhẩm có thể làm con toán nhân này, khong cần mẹo gì
2. Với cái kiến thức "5 tức là 10 chia 2, và nhân 10 có nghĩa là cộng thêm 1 số 0", người quen tính nhẩm có thể áp dụng
Như vậy, thuật toán 2 tốt hơn 1. Để có thể làm như vậy, bạn phải thêm 1 kiến thức (5x2 = 10)
Có cái gì chưa ổn?
Thực ra, để sử dụng kiến thức 5x2=10 bạn còn phải dựa trên các đinh luật toán sau:
(1) nếu a1=b1*c1 và c2=c1*d1 thì a1=b1*c2/d1; luật này thì dễ hiểu rồi
(2) luật thứ hai hơi sâu 1 chút, chúng ta ít khi học tới là vì nó được hiểu ngầm
- cách diễn tả số trong toán số thường ngày của ta là cách diễn tả của hệ thống thập phân. Theo cách diễn tả này thì con toán nhân 10^n chỉ giản dị là dời cả nhóm số về bên trái n đơn vị. Như vậy, con toán nhân 10 là con toán rất dễ thực hiện tính nhẩm!

Thuật toán cao cấp thuộc về toán cao cấp. Nó chỉ giành cho những người thực sự muốn học về lập trình giải tích số (numerical analysis) và lập trình trí tuệ nhân tạo (artificial intelligence). Những thuật toán này thường độc lập với ngôn ngữ và môi trường.

Nói xong phần cao cấp, bây giờ đến phần mới bắt đầu:
Hiện nay, cái thuật toán hầu hết dựa trên kinh nghiệm. Làm quen rồi thì bạn tự động biết cách A hiệu quả hơn cách B. Đó là lý do tại sao tôi nói cứ cắm cúi làm một thời gian tự động sẽ quen.
Tuy nhiên, từ quen đến giỏi cần phải có đầu óc cởi mở để tiếp thu những cái thủ thuật mẹo của người khác. Những thủ thuật mẹo này chính là cái mà tôi gọi là thuật toán ứng dụng. Những thuật toán này thường đi sát với môi trường.

VBA là công cụ của Access được du nhập vào Excel. Về sau này thực sự được sử dụng ở Excel nhiều hơn bởi vì Excel đã chiếm được ngôi vị độc tôn trong bảng tính (mãi gần đây mới bị Google Sheets cạnh tranh) trong khi Access bị các phần mềm CSDL khác nện tơi tả. Vì vậy học VBA cũng đồng thời phải học cách sử dụng giao diện với bảng tính - tức là các đối tượng của bảng tính. Một số tiện nghi khác trên nền tảng Windows cũng sẽ được sử dụng, điển hình là các đối tượng của VBScript như Dictionary, Regexp... Bên CSDL thì có ADO...

Lập trình tới một mức độ nào đó, bạn bắt buộc phải chấp nhận rằng tự mình không đủ thì giờ để viết tất cả những chức năng cần thiết. Và bạn phải học qua cách sử dụng những gì được người khác cung cấp sẵn. Điển hình là khi bạn thấy người ta sử dụng các đối tượng của Windows qua API

Các ngôn ngữ tổng quát hơn có thư viện riêng của chúng. Điển hình C# có dot net, C++ có STL, Java có Beans, JavaScript có JQuery, JSON...
cám ơn thầy đã chia sẻ ạ :)
 
Cập nhật về từ ngữ "thuật toán":

Tôi mới vừa tư vấn một người bạn, có thể tạm coi người này là chuyên gia về thuật toán (algorithm). Câu trả lời của người này như sau:

Đem tốc độ để làm ví dụ cho thuật toán là một cái nhìn hạn hẹp. Thuật toán còn là cái khác biệt giữa sai số chấp nhận và không thể chấp nhận. Và có những vấn đề nếu không có thuật toán nghiêm chỉnh thì không thể giải.

Đó là lời của người ấy. Phần giải thích thêm của riêng tôi về sai số như sau:
Giải một hệ thống phương trình n ẩn số, nếu chỉ dùng phương pháp Gauss thuần túy thì sẽ nhanh hơn các cách cải tiến khác. Nhưng khi số n lớn thì khả năng sai của phép Gauss không cải tiến rất cao.
 
Vì kiến thức diễn đàn rất rộng và nhiều vấn đề, chỉ phù hợp với người đã có kiến thức về VBA. Bạn chưa biết gì thì nên đọc sách "Lập trình VBA cho người mới bắt đầu" để có đường đi, đừng vội và đừng sợ. Tiếc là sách mới chưa xuất bản được dù đã dồn bao tâm huyết, update nhiều nội dung.
 
Cập nhật về từ ngữ "thuật toán":

Tôi mới vừa tư vấn một người bạn, có thể tạm coi người này là chuyên gia về thuật toán (algorithm). Câu trả lời của người này như sau:

Đem tốc độ để làm ví dụ cho thuật toán là một cái nhìn hạn hẹp. Thuật toán còn là cái khác biệt giữa sai số chấp nhận và không thể chấp nhận. Và có những vấn đề nếu không có thuật toán nghiêm chỉnh thì không thể giải.

Đó là lời của người ấy. Phần giải thích thêm của riêng tôi về sai số như sau:
Giải một hệ thống phương trình n ẩn số, nếu chỉ dùng phương pháp Gauss thuần túy thì sẽ nhanh hơn các cách cải tiến khác. Nhưng khi số n lớn thì khả năng sai của phép Gauss không cải tiến rất cao.

Thưa anh, làm sao để có thể biết Gauss là gì khi em học hết lớp 12 đã đi phụ hồ để xây dựng đất nước ? và đến giờ vẫn chưa hiểu tại sao mình được tốt nghiệp cấp 3 ?
 
Đọc sách là đúng rồi. Nhưng không phải cái mua ngoài cửa hàng mới là sách. Cả một help to đùng là sách chứ còn là gì? Những bài đăng trên mạng là sách chứ là gì? Khi tôi cài Delphi thì sách ngoài cửa hàng hiếm, trên mạng cũng không nhiều vì internet ở thời kỳ đầu. Nhưng tôi thấy kèm với help về Delphi thì trong thư mục còn có cả help Windows API. Mà trong help thì có rất nhiều mục nói về từng control của Window, về cơ chế thông điệp của system, về cơ chế của Clipboard, cơ chế của hook, các thao tác liên quan đến đồ họa v... Mỗi một phần đều có ví dụ. Chỉ việc đọc, chạy thử ví dụ. Nếu được thì thử biến tấu - tham số khác chẳng hạn. Trên cơ sở đó mà hiểu được cách làm việc. Nếu quyển help đó là sách giấy thì có thể nói là tôi đã đọc nó nát bơm hết rồi.
Help VBA cũng là một sách lớn. Sau khi có khái niệm về hệ thống đối tượng của tập tin Excel thì có thể thử giải quyết vấn đề hàng ngày của mình. Vd. ai cũng từng một lần tô đậm giá trị trong một ô, hoặc đổi mầu chữ. Vậy thì thử làm bằng code xem sao. Nếu đã có khái niệm như tôi trình bầy thì biết là ô (vùng), tức Range, nằm trên sheet, tức worksheet, cụ thể, mà sheet lại thuộc tập tin, tức workbook, cụ thể. Vậy thì muốn thay đổi mầu chữ, tức mầu của Font, của một ô (vùng) thì phải xem trong những thuộc tính, phương thức của đối tượng Range có cái gì dính dáng tới Font không. Như tôi đã nói: Alt + F11 -> menu View -> Object Browser -> chọn Range ở ListBox trái -> nhìn sang ListBox phải sẽ có các phương thức và thuộc tính của đối tượng Range. Tuy các tên đều bằng tiếng Anh nhưng ai biết chút tiếng Anh thì thấy là bác Bill đặt các tên mà chỉ cần nhìn vào đã có thể chắc 50% về ý nghĩa của phương thức hay thuộc tính. Chẳng hạn nhìn thấy thuộc tính Font thì có thể chắc 50% là nó liên quan tới phông chữ. Vậy chọn Font và nhấn F1. Lúc này thì rõ ràng 100% rồi. Mà lại có cả ví dụ
This example determines the if the font name for cell A1 is Arial and notifies the user.

Visual Basic for Applications
Sub CheckFont()

Range("A1").Select

' Determine if the font name for selected cell is Arial.
If Range("A1").Font.Name = "Arial" Then
MsgBox "The font name for this cell is 'Arial'"
Else
MsgBox "The font name for this cell is not 'Arial'"
End If

End Sub
Chỉ còn nước copy vào một Module rồi chạy thôi. Sau khi tận mắt chứng kiến việc đọc thuộc tính Name của đối tượng Font thì thử đọc các thuộc tính khác xem. Vd. Bold (lại cái tên mà chưa đọc đã đoán được nó nói về gì), Italic, Size, Color v...v Nhưng lại tò mò tiếp: thử thiết lập thuộc tính khác đi xem thế nào. Vd. Range("A1").Font.Name = "Times New Roman". Thử thay đổi Bold, Italic, Size, Color v...v
Đọc 1 ví dụ về cách đọc ra (read) thuộc tính Name của Font thì phải thử nghiệm với các thuộc tính khác, và cả thay đổi thuộc tính (write). Có như vậy mới là học 1 biết 10. Người ta cho 1 ví dụ nhưng mình phải sáng tạo. Ngược lại thì có mua 10 quyển sách giấy thì cũng chỉ biết được những ví dụ mà người ta viết, không học thêm được gì hơn. Lúc đó muốn học thêm những thứ khác thì lại mua sách khác, thêm một lớp nâng cao, rồi một lớp tuyệt chiêu, rồi lớp nâng cao nữa? Người biết học và biết sáng tạo thì đọc xong sách của Excel VBA là biết rất nhiều. Nếu có cơ bản - cái phần 2 và 3 ở bài trước tôi viết - thì sẽ biết phân tích các ví dụ đơn giản, dần dần tới phứp tạp, những ví dụ đầy rẫy trên mạng, trên các diễn đàn. Sách khủng, sách dài vô tận, sách tốt nhất trong các loại sách. Chẳng phải đi đâu, ngồi máy một bên là cà phê, bên kia là bia, trên đùi là gái đẹp. Cứ thế một vài tiếng mỗi ngày thay cho game, karaoke, nhậu tay vịn, phây sờ búc (toàn thứ nhí nhố)
 
Thưa anh, làm sao để có thể biết Gauss là gì khi em học hết lớp 12 đã đi phụ hồ để xây dựng đất nước ? và đến giờ vẫn chưa hiểu tại sao mình được tốt nghiệp cấp 3 ?
1. làm sao để có thể biết Gauss là gì: chỉ những người biết mới nói ra câu này. Nếu không biết thì đã làm thinh. Nó giống như câu hỏi "Đạo là gì?", chỉ những người tìm hiểu Đạo rồi mới hỏi.
2. chưa hiểu tại sao mình được tốt nghiệp cấp 3: cấp 3 là gì?
 
Web KT
Back
Top Bottom