Hỏi nhanh - Đáp nhanh về macro (dành cho các thành viên mới học lập trình)

Liên hệ QC

tuananhya2

Thành viên mới
Tham gia
18/8/12
Bài viết
8
Được thích
0
Co ai chỉ dùm cách tạo pass marco với
 
Ý tôi là:
Nếu chỉ thoát khỏi vòng lặp (exit for) thì i, j còn đó.
Nếu thoát khỏi sub/function (exit sub/function) thì nếu i, j là biến nội thì chúng bị giải toả hêt. Phải đặt là biến toàn cục mới còn.
Nếu dừng chương trình (lời của chủ đề, tức là end) thì biến gì cũng mất hết. Phương pháp nào đó để moi lại hay giữ thì tôi chưa học tới.

Trong trường hợp thứ 3, nếu muốn giữ thì phải giữ trước khi thoát chứ không thể "...dừng lại và lấy giá trị..." được

Người hỏi bài này cần học lại về phạm vi của biến, chương trình con và chương trình chính, và dùng đúng từ ngữ.
 
Lần chỉnh sửa cuối:
Upvote 0
tập tành VBA

Các bác ơi, em mới tập tành code vba nên phải nói là còn rất chi là gà :3. Em cần xin code 1 hàm (Function) tính tổng của cell trong vùng chọn ( tất nhiên là em biết trong excel đã có hàm sum). Bác nào có thể giúp em để em tham khảo với nhé. Tks các bác nhiều
 
Upvote 0
Upvote 0
Ý tôi là:
Nếu chỉ thoát khỏi vòng lặp (exit for) thì i, j còn đó.
Nếu thoát khỏi sub/function (exit sub/function) thì nếu i, j là biến nội thì chúng bị giải toả hêt. Phải đặt là biến toàn cục mới còn.
Nếu dừng chương trình (lời của chủ đề, tức là end) thì biến gì cũng mất hết. Phương pháp nào đó để moi lại hay giữ thì tôi chưa học tới.

Trong trường hợp thứ 3, nếu muốn giữ thì phải giữ trước khi thoát chứ không thể "...dừng lại và lấy giá trị..." được

Người hỏi bài này cần học lại về phạm vi của biến, chương trình con và chương trình chính, và dùng đúng từ ngữ.

Bài của bác Ba Tê là thỏa ý người hỏi rồi. Bài của bạn tuy đúng nhưng làm người ta sợ. Tôi đã học VBA 5 năm nay nhưng cũng chưa học đến những bài này. Với những bạn mới học VBA thì cứ tà tà làm tới đâu học tới đó, không cần quan tâm bắt đầu từ đâu, càng đơn giản hóa vấn đề càng dễ học hỏi, cái gì cần biết thì dần dần sẽ biết (có lẽ do mình bảo thủ chăng ?).
 
Lần chỉnh sửa cuối:
Upvote 0
Bài của bác Ba Tê là thỏa ý người hỏi rồi. Bài của bạn tuy đúng nhưng làm người ta sợ. Tôi đã học VBA 5 năm nay nhưng cũng chưa học đến những bài này. Với những bạn mới học VBA thì cứ tà tà làm tới đâu học tới đó, không cần quan tâm bắt đầu từ đâu, càng đơn giản hóa vấn đề càng dễ học hỏi, cái gì cần biết thì dần dần sẽ biết (có lẽ do mình bảo thủ chăng ?).

Sự không cùng ngôn ngữ đưa ra việc một câu hỏi phải đưa đi đưa lại mấy lần mới đúng ý người hỏi. Cuối cùng dẫn đến việc một đề bài đáng lẽ chỉ cần trung bình 3 câu trả lời (mỗi câu đề nghị một cách giải), vì vấn đề hiểu lầm nảy sinh ra thành hơn chục câu.

Tôi không biết gì về tôn chỉ hoạt động của diễn đàn này và hoàn toàn mù tịt về web site này nên điều sau đây tôi chỉ đoán mò:
Database phải chứa và truy cập số lượng bài nhiều gấp mấy lần bình thường cho nên cache của nó bị quá tải. Đưa đến tình trạng chạy chậm và thường xuyên time out vào giờ cao điểm.

Nếu điều trên không đúng thì tôi xin lỗi mọi người và hứa rằng kể từ nay tôi không nói chuyện về cách thức làm việc nữa.
 
Upvote 0
Tôi làm việc với đủ tầng lớp người khác nhau nhiều năm. Đâu dễ giận vậy?
Tôi chỉ nói "không bàn cách thức làm việc", có nghĩa là tôi sẵn sàng chìu theo số đông, họ làm gì tôi theo nấy, không xúi dục ai theo đường lối của mình nữa.
 
Upvote 0
Trở lại vấn đề câu hỏi. Câu hỏi dùng từ "dừng chương trình" nên tôi mới đề nghị dùng lệnh "end"
Nếu nguời hỏi muốn biết làm cách nào để thoát ra khỏi 2 vòng lặp thì phải làm như sau:

Mã:
For  I = 1  to 10
     If a = b then
          For j=1 to 10 
               If c<d then Exit For[COLOR=#008000] ' nhảy ra khỏi vòng trong[/COLOR]
               End if
         Next
         If j <= 10 Then Exit For[COLOR=#008000] ' nhảy ra khỏi vòng ngoài[/COLOR]
      End if
Next
[COLOR=#008000]' ở đây có thể lấy trị i, j.
' Tuy nhiên vì vòng lặp j chứa trong điều kiện If a = b cho nên trị j là trị chỉ có ý nghĩa tuỳ theo điều kiện
' Cách tốt hơn là lấy i, j ngay lúc thoả điều kiện c<d và dùng lệnh goto để nhảy vào một label nghay sau hai vòng lặp
[/COLOR]

Dù dùng cách nào đi nữa thì code ví dụ của chủ đề đều đưa ra một trị J không đáng tin cậy. Nếu điều kiện a=b không thoả thì J chứa trị trước khi vòng lặp i được thực hiện
 
Upvote 0
Trở lại vấn đề câu hỏi. Câu hỏi dùng từ "dừng chương trình" nên tôi mới đề nghị dùng lệnh "end"
Nếu nguời hỏi muốn biết làm cách nào để thoát ra khỏi 2 vòng lặp thì phải làm như sau:

Mã:
For  I = 1  to 10
     If a = b then
          For j=1 to 10 
               [COLOR=#ff0000]If c<d then Exit For [/COLOR][COLOR=#008000]' nhảy ra khỏi vòng trong[/COLOR]
               [COLOR=#ff0000]End if[/COLOR]
         Next
         [COLOR=#ff0000]If j <= 10 Then Exit For[/COLOR][COLOR=#008000] ' nhảy ra khỏi vòng ngoài[/COLOR]
      End if
Next
[COLOR=#008000]...
[/COLOR]
...

VetMini hoặc bạn nào biết giúp mình câu hỏi này:

Khi viết If .... Then .... thì không cần phải End if (giống như câu lệnh If j <= 10 Then Exit For ở trên)

Vậy tại sao trong đoạn mã dưới đây đã If c<d then Exit For rồi mà vẫn phải End if ?
If c<d then Exit For ' nhảy ra khỏi vòng trong
End if

Câu hỏi thành tâm, không có ý gì khác nếu như đoạn code trên có sơ xuất. Thanks !
 
Upvote 0
VetMini hoặc bạn nào biết giúp mình câu hỏi này:

Khi viết If .... Then .... thì không cần phải End if (giống như câu lệnh If j <= 10 Then Exit For ở trên)

Vậy tại sao trong đoạn mã dưới đây đã If c<d then Exit For rồi mà vẫn phải End if ?
If c<d then Exit For ' nhảy ra khỏi vòng trong
End if

Câu hỏi thành tâm, không có ý gì khác nếu như đoạn code trên có sơ xuất. Thanks !

Xin lỗi, quên xoá dòng ấy. Lúc compile sẽ báo lỗi.

Luật chính thức như thế này:
If là một lệnh rẽ nhánh có điều kiện
Cấu trúc Then ... bảo compiler rằng điểm nhảy rẽ (nếu không thoả điều kiện) là lệnh (dòng) kế tiếp
Cấu trúc Then (xuống dòng) bảo compiler rằng điểm nhảy rẽ (nếu không thoả điều kiện) là dòng Else, ElseIf hoặc End If gần nhất.

(*) compiler là bộ máy dịch ngôn ngữ.

=== chỉnh thêm ===
Trên thực tế, compiler sẽ hiểu lầm cái End If đó là điểm kết của cái If a = b trước đây. Thế là lộn tùng phèo hết. Tôi nghĩ là sẽ báo lỗi ở dòng For-Next (hai code blocks tréo nhau) thay vì end if.
 
Lần chỉnh sửa cuối:
Upvote 0
VetMini
Cấu trúc Then ... bảo compiler rằng điểm nhảy rẽ (nếu không thoả điều kiện) là lệnh (dòng) kế tiếp
Cấu trúc Then (xuống dòng) bảo compiler rằng điểm nhảy rẽ (nếu không thoả điều kiện) là dòng Else, ElseIf hoặc End If gần nhất.

Trong VBA thường xuyên dùng If ... Then và lâu nay cứ hiểu nôm na là Nếu...Thì mà phang. Giờ mới được biết nghĩa đen của nó.

Cám ơn VetMini nhiều !
 
Lần chỉnh sửa cuối:
Upvote 0
Hỏi về cách chuyển đổi định dạng?

Xin chào Thầy cô và Anh Chị trong GPE!
Em đang gặp phải một tình trạng là file định dạng dữ liệu vừa kiểu ngày tháng năm và vừa kiểu dạng text.
Hiện giờ Em đã định dạng dữ liệu về kiểu "dd/mm/yyy" nhưng có một số dữ liệu kiểu text không thể chuyển đổi được mà buộc phải kích đúp chuột vào ô đó thì mới được.
Nếu dữ liệu ót thì không sao nhưng bảng dữ liệu cũng khá nhiều vì vậy Em muốn hỏi GPE có cách nào để chuyển đổi nhanh hơn không ạ!
Cụ thể hơn thì Thầy cô và Anh Chị xem file kèm ạ!
Em xin cảm ơn!
 

File đính kèm

  • DateText.xlsx
    9.6 KB · Đọc: 7
Upvote 0
Thử công thức này xem nhé :

PHP:
=IF(ISTEXT(B3),DATE(RIGHT(B3,4),MID(B3,4,2),LEFT(B3,2)),B3)
Copy xuống
 
Upvote 0
OK đó Hoa àh, Cảm ơn Hoa nhiều nhé như vậy mình sẽ phải làm bên cạnh sau đó Copypase sang bảng dữ liệu cũ.
Với code thì sao Hoa có cách nào không? Hì...đã lười lại muốn lười hơn đó mà.. (^_-)!
 
Upvote 0
Xin chào Thầy cô và Anh Chị trong GPE!
Em đang gặp phải một tình trạng là file định dạng dữ liệu vừa kiểu ngày tháng năm và vừa kiểu dạng text.
Hiện giờ Em đã định dạng dữ liệu về kiểu "dd/mm/yyy" nhưng có một số dữ liệu kiểu text không thể chuyển đổi được mà buộc phải kích đúp chuột vào ô đó thì mới được.
Nếu dữ liệu ót thì không sao nhưng bảng dữ liệu cũng khá nhiều vì vậy Em muốn hỏi GPE có cách nào để chuyển đổi nhanh hơn không ạ!
Cụ thể hơn thì Thầy cô và Anh Chị xem file kèm ạ!
Em xin cảm ơn!
1 cách thủ công:
1/ Nhập số 1 vào 1 ô nào đó, Copy
2/ Chọn nguyên vùng dữ liệu muốn chuyển, Paste special - Multiply
3/ Format vùng vừa Paste kiểu Date mà bạn muốn.
4/ Xóa ô vừa nhập số 1 hồi nãy.
 
Upvote 0
1 cách thủ công:
1/ Nhập số 1 vào 1 ô nào đó, Copy
2/ Chọn nguyên vùng dữ liệu muốn chuyển, Paste special - Multiply
3/ Format vùng vừa Paste kiểu Date mà bạn muốn.
4/ Xóa ô vừa nhập số 1 hồi nãy.

Thầy ạ! Em làm như thế này Nhập số một theo các ngày tương ứng rồi sau đó Paste special - Multiply thì những giá trị dạng text nó vẫn là số 1 Thầy ạ!
Thầy có thể gửi video hướng dẫn lên con coi với được không ạ.+-+-+-+
Cảm ơn Thầy!
 
Upvote 0
Thầy ạ! Em làm như thế này Nhập số một theo các ngày tương ứng rồi sau đó Paste special - Multiply thì những giá trị dạng text nó vẫn là số 1 Thầy ạ!
Thầy có thể gửi video hướng dẫn lên con coi với được không ạ.+-+-+-+
Cảm ơn Thầy!
Không hiểu bạn làm kiểu gì và không biết dữ liệu của bạn có các dạng ra sao?
Với dữ liệu như file mẫu của bạn ở trên thì tôi đã làm như vậy và đã ra kết quả là ngày tháng.
 

File đính kèm

  • Copy of DateText-2.xls
    23.5 KB · Đọc: 2
Lần chỉnh sửa cuối:
Upvote 0
Không hiểu bạn làm kiểu gì và không biết dữ liệu của bạn có các dạng ra sao?
Với dữ liệu như file mẫu của bạn ở trên thì tôi đã làm như vậy và đã ra kết quả là ngày tháng.
Con làm như thế này Thầy ạ:
[video=youtube;sUWYMqsPzT4]http://www.youtube.com/watch?v=sUWYMqsPzT4&amp;feature=youtu.be[/video]
 
Upvote 0
Con làm như thế này Thầy ạ:
[video=youtube;sUWYMqsPzT4]http://www.youtube.com/watch?v=sUWYMqsPzT4&amp;feature=youtu.be[/video]

Không xem được video, nó bảo "Đây là video riêng tư"
Nói chung, bạn làm đúng theo hướng dẫn bên trên không?
Chỉ gõ số 1 vào 1 ô nào đó thôi. (Như file trong bài #197 tôi nhập vào ô I6, ô này phải là Number, chỉ hiện nội dung là số 1) Rồi copy 1 ô I6 đó, chọn vùng cần chuyển sang dạng date (Trong file tôi tô chọn vùng B3:B10), Past special - Multiply. Nó sẽ chuyển thành dạng Number, Format vùng này thành Date lại là xong, xóa ô I6
Những ô là Text nhưng không có giống dạng ngày tháng thì lỗi .
 
Lần chỉnh sửa cuối:
Upvote 0
Thầy ạ! Em làm như thế này Nhập số một theo các ngày tương ứng rồi sau đó Paste special - Multiply thì những giá trị dạng text nó vẫn là số 1 Thầy ạ!
Thầy có thể gửi video hướng dẫn lên con coi với được không ạ.+-+-+-+
Cảm ơn Thầy!

Không cần phải nhập bất cứ số nào vào cell nào cả
Bạn làm vầy nhé:
- Chọn 1 cell rổng bất kỳ rồi Ctrl + C (copy cell rổng ấy)
- Quét chọn vùng dữ liệu chứa ngày tháng của bạn rồi Click chuột phải, chọn Paste Special ---> Check mục Values và mục Add ---> nhấn nút OK
Xong


[video=youtube;QJMoHqbspX8]http://www.youtube.com/watch?v=QJMoHqbspX8&feature=youtu.be[/video]
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom