Đố vui về VBA! (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
Nhằm cũng cố kiến thức về VBA cho các bạn mới bắt đầu và cả những bạn đang ứng dụng mà chưa hiểu nhiều về nó, tôi mở topic này với mong mõi qua những câu hỏi vui, các bạn sẽ nhận định lại sự hiểu biết cũa mình... (Kễ cã chính tôi cũng đang tập tành nên có rất nhiều cái chưa biết)
Mong rằng topic sẽ mang đến cho các bạn những khám phá thú vị với những cái tưỡng chừng như đã biết
Mong nhận dc bài viết về câu đố cũa các cao thủ! Còn các bạn mới thì đừng ngại khi đưa ra ý kiến cũa mình.. Có sai có sữa sẽ hoàn thiện!
Tôi xin mỡ màn trước bằng 1 câu hỏi đơn giãn
ANH TUẤN

CÂU HỎI 1: Tại sao biến K ko hoạt động?
Tôi muốn khi nhấn vào 1 button thì cell A1 sẽ tăng lên 1 đơn vị... Tôi đã làm như sau:
-Tạo 1 Command Button (nút nhấn thuộc thanh Control Toolbox), click phải chuột lên nút nhấn, chọn View code, rồi gõ vào đoạn code sau:
PHP:
Private Sub CommandButton1_Click()
   K = K + 1
   Range("A1").Value = K
End Sub
Ban đầu K chưa có gì, xem như =0, nhấn nút lần thứ nhất thì K dc tăng thêm 1, vậy K hiện tại sẽ bằng 1, và gán K vào cell A1 thì đương nhiên A1 sẽ =1... Nhấn nút lần 2, K lại dc tăng thêm 1 nên hiện tại K sẽ =2 và cell A1 cũng sẽ =2... vân vân.. từ đó diễn tiến tiếp...
Hi.. hi.. Điều này nghe qua có vẽ rất hợp lý, ấy thế mà khi nhấn nút nó chỉ hoạt động dc duy nhất 1 lần (A1 = 1) rồi thôi ko nhút nhít nữa...
Các bạn có thể giãi thích tại sao lại như thế ko? Tại sao những lần nhấn nút sau đó K lại ko tăng thêm tí nào (vì thực tế A1 vẫn cứ = 1 hoài) ?
ANH TUẤN
 
Thử Google
Mã:
".Close False" site:www.giaiphapexcel.com
xem có bao nhiêu kết quả và cũ nhất là khi nào.
Trả lời đáp án luôn nè huuthang_bd:

Mã:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
[COLOR=#ff0000][B]    ThisWorkbook.Saved = [/B][/COLOR][COLOR=#0000ff][B]True[/B][/COLOR]
End Sub
 
Upvote 0
Thử Google
Mã:
".Close False" site:www.giaiphapexcel.com
xem có bao nhiêu kết quả và cũ nhất là khi nào.
Ngày 15/10/2008: Ngăn chặn các nhắc nhở không cần thiết

Chiêu thứ 4: Ngăn chặn các nhắc nhở không cần thiết

Hoặc, nếu bạn cần các hàm volatile nhưng không muốn Excel lưu lại các thay đổi không nhìn thấy này bạn có thể thêm đoạn code sau vào Workbook module của Personal Macro Workbook để đánh lừa nó là bảng tính đã được lưu rồi.

PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Me.Saved = True
  End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bởi vậy mới nói:

Ủa, đố vui mà, ngắn gọn và hiệu quả, nhưng cũng bất ngờ, ở diễn đàn bây giờ, tìm được câu đố mà chưa có trong diễn là hiếm đó, thử hỏi cái gì mà không có trên diễn đàn này? Hầu như về lập trình cho Excel đều có hết đáp án rồi!

Khó khăn lắm tôi mới tìm được một đề tài vừa tầm để đố, chứ thư viện API mà đem vào đố chắc biết mấy ai tham gia?

Mình tham gia tháng 8/2008, bài đó nó chỉ có sau chừng 2 tháng! Nếu mà lúc đó mình biết VBA chắc mình bây giờ cũng chết tiệt lắm đây!

P/s: Thiết nghĩ khi đã có câu lệnh rồi thì search trên diễn đàn có nhiều, nhưng để mà nhớ cũng chưa chắc ai đã nhớ để trả lời à!
 
Lần chỉnh sửa cuối:
Upvote 0
làm sao tắt DropDownList của Combobox ?

chào các bạn GPE , nhân dịp cuối tuần mời các bạn giải trí với câu đố dễ sau đây
khi cần hiện ra List của Combobox ta dùng
Mã:
ComboBox1.DropDown
vậy khi cần tắt cái DropDownList này mà không làm mất Text hiện tại trên Combobox thì ta làm sao đây ? xin mời các bạn
Chúc cuối tuần vui vẽ và đừng bỏ lỡ Siêu kinh điển vào 0h00 đêm nay
 

File đính kèm

Upvote 0
chào các bạn GPE , nhân dịp cuối tuần mời các bạn giải trí với câu đố dễ sau đây
khi cần hiện ra List của Combobox ta dùng
Mã:
ComboBox1.DropDown
vậy khi cần tắt cái DropDownList này mà không làm mất Text hiện tại trên Combobox thì ta làm sao đây ? xin mời các bạn
Chúc cuối tuần vui vẽ và đừng bỏ lỡ Siêu kinh điển vào 0h00 đêm nay
Làm vầy được không
PHP:
 If KeyCode <> 27 Then Application.SendKeys "{ESC}"
 
Upvote 0
Làm vầy được không
PHP:
 If KeyCode <> 27 Then Application.SendKeys "{ESC}"

bấm zô cái nó mất hết text của Combobox . Hic

chào các bạn GPE , nhân dịp cuối tuần mời các bạn giải trí với câu đố dễ sau đây
khi cần hiện ra List của Combobox ta dùng
Mã:
ComboBox1.DropDown
vậy khi cần tắt cái DropDownList này mà không làm mất Text hiện tại trên Combobox thì ta làm sao đây ? xin mời các bạn
Chúc cuối tuần vui vẽ và đừng bỏ lỡ Siêu kinh điển vào 0h00 đêm nay
 
Upvote 0
Tôi có một macro như sau:
PHP:
Sub ABC()
    MsgBox "Press Ctrl + Pause"
    ThisWorkbook.Close False
End Sub
Khi thông báo xuất hiện, người dùng có thể dừng macro bằng tổ hợp phím Ctrl + Pause. Vậy có cách nào ngăn người dùng dừng macro không?
 
Upvote 0
Tôi có một macro như sau:
PHP:
Sub ABC()
    MsgBox "Press Ctrl + Pause"
    ThisWorkbook.Close False
End Sub
Khi thông báo xuất hiện, người dùng có thể dừng macro bằng tổ hợp phím Ctrl + Pause. Vậy có cách nào ngăn người dùng dừng macro không?
Trùi ui, cái này trong mấy cái file đăng nhập của mình có đó! Đang đăng nhập mà nó chơi kiểu Ctrl+Break là vào nhà liền! Nên phải có câu lệnh đó để ngăn không cho sử dụng tổ hợp phím đó.
 
Upvote 0
có cách khác là dùng API giết luôn cửa sổ DropDownList , nhưng mà dài quá , cách trên hay hơn chứ
Còn cách khác nè. Vì đang dùng trong sự kiện KeyUp nên cách này sẽ an toàn hơn SendKey
PHP:
With ComboBox1
    .Visible = False
    .Visible = True
    .SetFocus
End With
 
Upvote 0
Ứng dụng của nó khi nào và ta có thể làm hàm kiểu Boolean để nhận biết Cbx.Dropdown hay không vậy bạn?
ứng dụng để khi filter List của Combobox nếu .Listcount = 0 thì tắt luôn DropDownList nhìn cho nó đẹp
còn làm kiểu Boolean để check Dropdown thì anh em mình giao lưu rồi mà ....
 
Upvote 0
Có một câu hỏi nhỏ dành cho các bạn mới bắt đầu với VBA thế này:
Các bạn hãy mở một workbook mới, chèn code dưới đây vào Thisworkbook
Mã:
Private Sub Workbook_SheetActivate(ByVal [COLOR=#FF0000][B]Sh[/B][/COLOR] As [B][COLOR=#FF0000]Object[/COLOR][/B])
  MsgBox "Tên sheet là: '" & Sh.Name & "'"
End Sub
Đây là sự kiện SheetActivate, mỗi khi chọn vào một sheet nào đó thì sự kiện sẽ được kích hoạt. Cụ thể, với code trên thì mỗi khi chọn sheet sẽ xuất hiện một thông báo
Code rất bình thường. Vấn đề là không biết các bạn có từng thắc mắc tại sao biến Sh lại được khai báo dạng Object mà không phải là Worksheet. Tức tại sao lại không là:
Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As [COLOR=#FF0000][B]Worksheet[/B][/COLOR])
Các bạn thử suy nghĩ xem!
 
Upvote 0
Có một câu hỏi nhỏ dành cho các bạn mới bắt đầu với VBA thế này:
Các bạn hãy mở một workbook mới, chèn code dưới đây vào Thisworkbook
Mã:
Private Sub Workbook_SheetActivate(ByVal [COLOR=#FF0000][B]Sh[/B][/COLOR] As [B][COLOR=#FF0000]Object[/COLOR][/B])
  MsgBox "Tên sheet là: '" & Sh.Name & "'"
End Sub
Đây là sự kiện SheetActivate, mỗi khi chọn vào một sheet nào đó thì sự kiện sẽ được kích hoạt. Cụ thể, với code trên thì mỗi khi chọn sheet sẽ xuất hiện một thông báo
Code rất bình thường. Vấn đề là không biết các bạn có từng thắc mắc tại sao biến Sh lại được khai báo dạng Object mà không phải là Worksheet. Tức tại sao lại không là:
Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As [COLOR=#FF0000][B]Worksheet[/B][/COLOR])
Các bạn thử suy nghĩ xem!

ồ chào ngài "Anhtuan1066" , lâu quá không thấy anh viết bài mới . hi hi
em đoán vì Object to hơn Worksheet , chắc là để chứa nhiều thứ khác ngoài Worksheet , hi hi
 
Upvote 0
ồ chào ngài "Anhtuan1066" , lâu quá không thấy anh viết bài mới . hi hi
em đoán vì Object to hơn Worksheet , chắc là để chứa nhiều thứ khác ngoài Worksheet , hi hi

Có thấy người ta ghi cái này không:
Có một câu hỏi nhỏ dành cho các bạn mới bắt đầu với VBA thế này:
Anh Chim Hồng thì chắc người ta phải mời.. đi chơi chỗ khác
Ẹc...Ẹc...
 
Upvote 0
Nhờ bác google một tẹo:
Gõ từ khóa: "Workbook_SheetActivate" enter một cái. Chọn link đầu tiên đọc...
"The activated sheet. Can be a Chart or Worksheet object."
 
Upvote 0
ồ chào ngài "Anhtuan1066" , lâu quá không thấy anh viết bài mới . hi hi
em đoán vì Object to hơn Worksheet , chắc là để chứa nhiều thứ khác ngoài Worksheet , hi hi

Bạn Lặn và Trồi dùng từ "to" là chưa đúng lắm. Nói là "bao quát" mới đúng.
"vật dụng trong nhà" bao quát hơn "cái bàn", có thể dùng để chỉ bàn hay ghế, giường tủ đều được.
 
Upvote 0
Worksheet chỉ là 1 loại Sheet trong workbook.Sheets nên không thể đại diện cho 1 sheet bất kỳ Activate được. Khi giải đáp úp mở e không "an toàn".
 
Upvote 0
Worksheet chỉ là 1 loại Sheet trong workbook.Sheets nên không thể đại diện cho 1 sheet bất kỳ Activate được. Khi giải đáp úp mở e không "an toàn".

Vậy thì sẵn đây bạn mở luôn khỏi úp, giải thích luôn cho bà con biết các phần tử của collection sheets có thể là những loại sheet nào. Và tại sao chỉ Object mới bao được hết. Tại sao VBA không có một loại sheet bao quát?
 
Upvote 0
Vậy thì sẵn đây bạn mở luôn khỏi úp, giải thích luôn cho bà con biết các phần tử của collection sheets có thể là những loại sheet nào. Và tại sao chỉ Object mới bao được hết. Tại sao VBA không có một loại sheet bao quát?

Để biết có những loại Sheet nào có thể, nhấn chuột phải vào SheetTab---Chọn lệnh Insert: Excel hiện ra 1 cửa sổ các loại Sheet mà ta có thể Insert vào là:

-Worksheet: Là bảng tính ta vẫn làm quen thuộc.

-Chart: Sheet để thiết lập đồ thị.

-MS Excel 4.0 Macro.

-MS Excel 5.0 Dialog.
 
Lần chỉnh sửa cuối:
Upvote 0
Có thể giải thích thêm chút nữa:
1. thuộc tính Sheets của Workbook
2. tại sao VBA không có một loại kiểu riêng cho sheets. vd private sub Workbook_SheetActivate(ByVal sh as SheetType)
 
Upvote 0
Có thể giải thích thêm chút nữa:
1. thuộc tính Sheets của Workbook
2. tại sao VBA không có một loại kiểu riêng cho sheets. vd private sub Workbook_SheetActivate(ByVal sh as SheetType)

Như đã từng thổ lộ, em đến với VBA không bằng đường "Hàng Không" mà theo các lối mòn do có những người từng đi tạo ra. Vậy nên cách trả lời của em không mang hơi hướng sách vở mà có tính thực tế nhiều.


Câu 1, đây là con đường để ai cũng có thể tìm đầy đủ thuộc tính cũng như phương thức của 1 đối tượng theo 2 cách rất du kích nhưng khá đầy đủ (Tất nhiên nếu được học tập hay nghiên cứu tài liệu chuẩn thì quá tốt rồi):

A-Cách thứ nhất:
1/Trong Option của VBA Editor nhớ đánh dấu kiểm vào Option: Auto List Member trên thẻ Edit.
2/Khai tạm 1 Code: ví dụ Sub Test()...............End Sub
3/Ta khai báo đối tượng Worksheet: Ví dụ Dim Sh as Worksheet.
Vậy giờ ta gõ Sh và dấu chấm VBA sẽ liệt kê đầy đủ các thuộc tính cũng như phương thức của Worksheet. Khi chọn 1 thuộc tính nào đó Tools Tip sẽ có hướng dẫn cú pháp cũng như yêu cầu của nó.

B-Cách thứ hai:
Trong cửa sổ Editor VBA code ta nhấn chọn nút Object Browser (Hình hộp carton mở tung ra ba chấm màu) sẽ mở ra Dialog: Object Browser
Em nói qua cách sử dụng nó
-Đây là từ điển tra cứu tất cả các đối tượng, nếu biết đối tượng thuộc thư viện nào thì chọn thư viện trong Combo đầu tiên, nếu không biết chọn All hay để trống.
-Gõ tên đối tượng cần tìm vào Textbox 2 (Để trống thì tìm tất nhưng hơi hoa mắt)
-Cửa sổ bên trái hiện toàn bộ các đối tượng cần tìm. Chọn đối tượng bất kỳ, dưới chân sẽ có dòng trích yếu lý lịch của đối tượng và cửa sổ bên phải liệt kê các thuộc tính và phương thức của đối tượng. Cần tra cứu thuộc tính nào ta chọn dòng thuộc tính đó dưới chân cửa sổ cũng có kê rõ nguồn gốc yêu cầu và cú pháp.
Cần chi tiết hơn thì tại đối tượng hay thuộc tính đang chọn nhấn nút có dấu ? sẽ mở ra trang Help khá cụ thể
Muốn tham khảo thêm chép thuộc tính đó vào Google xem thiên hạ họ làm. Ngoài ra còn có 1 số chức năng nữa tùy yêu cầu nghiên cứu thêm.
Từ đây tự tìm hiểu thuộc tính Sheets có lẽ đầy đủ hơn giải thích.


Câu 2:

Private Sub Workbook_SheetActivate(ByVal Sh As Worksheet)

Đây là Proceduce của sự kiện chọn 1 sheet bất kỳ của Workbook. Hơn nữa, tham số Sh là biến đại diện cho chính Sheet được chọn mở. Như ta đã biết có nhiều loại Sheet trong Workbook có thể chọn mở nên VBA quy định bắt buộc tham số Sh phải khai báo dạng Object, nếu khai báo khác đi VBA không thừa nhận sự kiện và phát sinh lỗi
 
Lần chỉnh sửa cuối:
Upvote 0
Bổ thêm:

Workbook có 3 thuộc tính collection liên quan đến sheet.
1. Worksheets: gồm tất cả các worksheets trong workbook
2. Charts: gồm tất cả các charts trong workbook. Lưu ý, đây chỉ là các charts loại chiếm hữu sheet riêng biệt. Các charts nằm bên trong worksheet không được tính.
3. Sheets: gồm tất cả các loại được liệt vào hàng "sheets", tức là cả gồm cả 2 cái collections kể trên, và thêm các loại sheet cổ điển nữa.

SheetActivate là loại hàm bắt sự kiện hàng sheets. Để biết được đối tượng của sự kiện, các hàm bắt sự kiện thường thảy đối tượng này vào làm tham số.

Theo nguyên tắc LT HĐT, code có thể gói (tiếng chuyên môn là box) đối tượng vào bậc (class) thô hơn để bao quát hoá kiểu dữ liệu, đến khi cần làm việc thẳng với đối tượng thì code lại mở gói (unbox). Hai đối tượng khác kiểu có thể mò về kiểu thô mà chúng chia sẻ gần nhất để gói/box (hãy tưởng tượng như ước số chung lớn nhất của 2 số nguyên). Hiện tượng này ta sẽ thường gặp trong collection, array, và tham số của hàm.

Tuy Worksheet và Chart có cùng đẳng cấp (sheets) nhưng trên thực tế chúng chả có gì giống nhau cả. Nếu phải dùng 1 class riêng để gói thì chả hữu lý chút nào. Vì vậy, hàm Workbook_SheetActivate gói thẳng chúng vào kiểu thô nhất là Object (nếu bạn đang tưởng tượng ước số chung thì đây là trường hợp số 14 và số 15, chúng đều có ước số nhưng không có ước số chung, cuối cùng quy về số 1)

@sealand: sỡ dĩ tôi đòi hỏi bạn giải thích thêm là vì tôi thấy đây là cơ hội tốt để các bạn mới tập code làm quen với khái niệm Đa Hình trong LT Hướng Đối Tượng.
 
Lần chỉnh sửa cuối:
Upvote 0
Với 1 UserForm duy nhất, ta có thể mở nhiều lần lên được không? Bằng cách nào?

(xem ảnh minh họa). +-+-+-+--=0
 

File đính kèm

  • OpenForm.jpg
    OpenForm.jpg
    49.5 KB · Đọc: 63
Upvote 0
Với 1 UserForm duy nhất, ta có thể mở nhiều lần lên được không? Bằng cách nào?

(xem ảnh minh họa). +-+-+-+--=0

các bạn không nên quá chú ý tới câu hỏi , mà hãy để ý cách anh í ghi câu cuối : xem ảnh minh họa , rồi cười .
xem ảnh xong các bạn sẽ nhận ra anh í có chìa khóa vạn năng để mở được VBA project nè , mở khóa Workbook được nè , ghê chưa ? :vampire: chứ câu hỏi thì trả lời ngắn gọn
Mã:
Public Sub hello()
Dim f1 As UserForm1, r As Byte
For r = 1 To 5 Step 1
    Set f1 = New UserForm1
    f1.Show 0
Next
End Sub
 
Upvote 0
các bạn không nên quá chú ý tới câu hỏi , mà hãy để ý cách anh í ghi câu cuối : xem ảnh minh họa , rồi cười .
xem ảnh xong các bạn sẽ nhận ra anh í có chìa khóa vạn năng để mở được VBA project nè , mở khóa Workbook được nè , ghê chưa ? :vampire: chứ câu hỏi thì trả lời ngắn gọn
Mã:
Public Sub hello()
Dim f1 As UserForm1, r As Byte
For r = 1 To 5 Step 1
    Set f1 = New UserForm1
    f1.Show 0
Next
End Sub

OK, cái tên này trả lời đúng rồi, nhưng mắc mớ gì phải STEP 1 chi không biết! Và có một chút phá bỉnh không hề nhẹ!

Vậy đố tiếp, bằng lệnh gì để tất cả các form show lên đó được Unload?
 
Upvote 0
OK, cái tên này trả lời đúng rồi, nhưng mắc mớ gì phải STEP 1 chi không biết! Và có một chút phá bỉnh không hề nhẹ!

Vậy đố tiếp, bằng lệnh gì để tất cả các form show lên đó được Unload?
Không biết như sau được không:

Mã:
Sub Dong()
    Dim frm As UserForm
    For Each frm In UserForms
        Unload frm
    Next
End Sub
 
Upvote 0
Không biết như sau được không:

Mã:
Sub Dong()
    Dim frm As UserForm
    For Each frm In UserForms
        Unload frm
    Next
End Sub
Cũng hay đấy chứ! Nhưng có thể có giải pháp khác không có vòng lặp được chăng?

Ứng dụng cho việc show một Form cho nhiều lần một lúc cũng hay hay, chẳng hạn như trong hình dưới đây, ta không cần thiết phải làm nhiều form cho một file!

attachment.php


attachment.php
 

File đính kèm

  • UngDung1.jpg
    UngDung1.jpg
    16.7 KB · Đọc: 51
  • UngDung2.jpg
    UngDung2.jpg
    92.8 KB · Đọc: 54
Upvote 0
Cũng hay đấy chứ! Nhưng có thể có giải pháp khác không có vòng lặp được chăng?

Ứng dụng cho việc show một Form cho nhiều lần một lúc cũng hay hay, chẳng hạn như trong hình dưới đây, ta không cần thiết phải làm nhiều form cho một file!

đố được 1 câu mà nhiều người không biết là anh ghê rồi , bữa nay doveandrose đành chịu bị lêu lêu chờ đáp án của ních xanh rồi . hu hu :.,:.,
 
Upvote 0
Nói đùa hay nói chơi vậy trời?

Thử làm cho một lố UserForm hiện lên đi, sau đó click vào sub này:

Mã:
Sub StopAnyCode()
    End
End Sub

Giả ngô giả nghê kinh quá!

trời ơi , em đâu có biết lệnh End này đâu
bài này nếu mà ép phải làm cho được thì em xài cách là viết lệnh
1/0
để có bảng báo lỗi hiện ra , code nó ngưng lại , Form cũng tiêu luôn =)) chứ đâu biết lệnh End gì
 
Upvote 0
trời ơi , em đâu có biết lệnh End này đâu
bài này nếu mà ép phải làm cho được thì em xài cách là viết lệnh
1/0
để có bảng báo lỗi hiện ra , code nó ngưng lại , Form cũng tiêu luôn =)) chứ đâu biết lệnh End gì
Lệnh End là giải phóng bộ nhớ toàn bộ, code nào đang thực thi nó cũng hốt tuốt! Nó cũng tương đương với em này nè:

Mã:
Sub Test2()
     Application.VBE.CommandBars(1).Controls("&Run").Controls("&Reset").Execute
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
các đại gia cho em ké tí với
em google thấy có đoạn code này có thể show một form được nhiều lần, ko biết có đúng ko
Sao phải xóa hết thế? Bài này cũng hay mà! Cũng có nhiều ứng dụng xài được! Không dùng cho việc này nhưng có thể dùng cho việc khác.;;;;;;;;;;;
 
Upvote 0
Sao phải xóa hết thế? Bài này cũng hay mà! Cũng có nhiều ứng dụng xài được! Không dùng cho việc này nhưng có thể dùng cho việc khác.;;;;;;;;;;;

thêm code vào chạy nó bị đụng cái gì đó, đang xem lại.......hihihih
cái này tải lâu rùi.......hôm nay làm 5s thấy nó.........hihihiih
 
Upvote 0
End là lệnh chấm dứt chương trình.
Tôi lười set forms lên để thử nên tôi không chắc. Nhưng nếu dựa theo lý thuyết để nói thì dùng lệnh End để đóng tất cả các Forms không đúng.
Nếu Form có các sự kiện liên quan đến đóng thì lúc đóng Form, câc sự kiện này sẽ được chạy. Nếu End thì không chạy gì nữa cả.

Ý kiến của tôi là vậy thôi. Bạn nào rảnh thì thử xem rồi cho bà con cùng biết.
 
Upvote 0
End là lệnh chấm dứt chương trình.
Tôi lười set forms lên để thử nên tôi không chắc. Nhưng nếu dựa theo lý thuyết để nói thì dùng lệnh End để đóng tất cả các Forms không đúng.
Nếu Form có các sự kiện liên quan đến đóng thì lúc đóng Form, câc sự kiện này sẽ được chạy. Nếu End thì không chạy gì nữa cả.

Ý kiến của tôi là vậy thôi. Bạn nào rảnh thì thử xem rồi cho bà con cùng biết.

Ở bài này em đã nói rất rõ vấn đề này rồi:

Lệnh End là giải phóng bộ nhớ toàn bộ, code nào đang thực thi nó cũng hốt tuốt! Nó cũng tương đương với em này nè:

Mã:
Sub Test2()
     Application.VBE.CommandBars(1).Controls("&Run").Controls("&Reset").Execute
End Sub

Dĩ nhiên là khi ta làm việc, tùy theo phương thức mà ta sử dụng code thế nào để chúng ta định hướng cho code làm việc hiệu quả.

Như bài của Hai Lúa Miền Tây chẳng hạn, ta cũng thấy rằng nếu có một form khác đang thực thi thì sẽ unload luôn:

Không biết như sau được không:
Mã:
Sub Dong()
    Dim frm As [COLOR=#ff0000][B]UserForm[/B][/COLOR]
    For Each frm In UserForms
        Unload frm
    Next
End Sub

Vì thế, ta chỉ việc hiệu chỉnh một chút lại là OK:

Mã:
Sub Dong()
    Dim frm As [COLOR=#0000cd][B]Object [/B][/COLOR]
    For Each frm In UserForms
[COLOR=#0000cd]        If frm.Name = "UserForm1" Then[/COLOR]
            Unload frm
[COLOR=#0000cd]        End If[/COLOR]
    Next
End Sub
 
Upvote 0
Hiệu quả là định nghĩa có tính chất chủ quan.
Đối với nhiều người ở đây, hiệu quả có nghĩa là chạy nhanh. Đối với tôi, hiệu quả có nghĩa là tránh được phản ứng phụ.

Lệnh End là lệnh có phản ứng phụ. Một khi gọi nó là chấm dứt code, tất cả những code dùng để dọn dẹp đều mất hiệu quả.
Trước mắt tôi thì một lệnh có phản ứng phụ như vậy không thể được dùng để thay thế một vòng lặp unload forms.
 
Upvote 0
Hiệu quả là định nghĩa có tính chất chủ quan.
Đối với nhiều người ở đây, hiệu quả có nghĩa là chạy nhanh. Đối với tôi, hiệu quả có nghĩa là tránh được phản ứng phụ.

Lệnh End là lệnh có phản ứng phụ. Một khi gọi nó là chấm dứt code, tất cả những code dùng để dọn dẹp đều mất hiệu quả.
Trước mắt tôi thì một lệnh có phản ứng phụ như vậy không thể được dùng để thay thế một vòng lặp unload forms.
Vậy thì tùy à, nếu quá nguy hiểm vậy anh Bill sẽ không cho ra sản phẩm End này rồi!
 
Upvote 0
Nguy hiểm hay không là do sử dụng.
Đại khái cũng gần như lệnh GOTO. Khi sử dụng, người viết code cần phải biết mình làm gì. Tôi không hề muốn biện luận "không nên dùng END". Xin nhấn mạnh lại 1 lần nữa, tôi chỉ muốn nêu ra "việc dùng END để kết thúc gọn gàng là quan điểm riêng của bạn. Nhưng bảo End có thể thay một vòng lặp đóng Forms là qua phần quan điểm chuing, và nó không đúng. Bởi vì code sự kiện đóng form có thể còn làm 1 vài công việc khác"

Chú thích: VBA có lệnh END để làm gì? Hầu hết các trường hợp, END dùng để gỡ rối, khi mọi thứ rối rắm quá, không còn đường rút lui. Gọi END môt phát, chấm dứt.
Tôi cũng có 1 vài lần phải nhét cái này vào code rồi. Nhưng trong các code này, tôi có cẩn thận dùng một hàm đặc biệt để báo là code bị End giữa chừng. Khi gặp cảnh báo, tôi dò lại dữ liệu xem sức mẻ ra sao. Nói chung, mõi lần gặp cái này mất cả buổi.
Lưu ý chú thích này là quan điểm riêng của tôi. Tôi làm việc trên môi trường dữ liệu là cơm ăn áo mặc cho nên tôi không đùa với chúng.
 
Upvote 0
Chắc có lẽ mình "điếc nên không sợ súng", nên End cũng xài, Goto cũng xài, Quit cũng xài tuốt và càng xài thấy càng tự tin. Bởi mình biết chắc rằng khi nào thì xài đến chúng, khi nào không.+-+-+-++-+-+-+
 
Upvote 0
VBA ko phải là managed code, dữ liệu bạn tạo ra, bạn phải tự xóa lấy, nếu ko xóa mà kết thúc chương trình đột ngột ( dùng lệnh End ) sẽ gây dò dỉ bộ nhớ ( leak memory ). :)
 
Upvote 0
Chắc có lẽ mình "điếc nên không sợ súng", nên End cũng xài, Goto cũng xài, Quit cũng xài tuốt và càng xài thấy càng tự tin. Bởi mình biết chắc rằng khi nào thì xài đến chúng, khi nào không.

Biết chắc thỉ cứ việc xài thôi!

E rằng hôm nay thấy "chắc", vài bữa nữa có thể thấy khác, kha kha,. . . . . với những chương trình đồ sộ hơn chẳng hạn!
 
Upvote 0
Tìm ra sự khác biệt giữa sự kiện Click và Change của ListBox!

thêm các câu hỏi hay đi các bác
Không biết câu hỏi này có "hay" hay là không, nhưng lâu quá không thấy đề tài nào khác nên đố chơi.

Với các dòng code trong UserForm:

Mã:
Option Explicit


Private Sub UserForm_Initialize()
    Dim i As Byte
    For i = 1 To 10
        ListBox1.AddItem i
    Next
End Sub


Private Sub ListBox1_Change()
    MsgBox "CHANGE"
End Sub


Private Sub ListBox1_Click()
    MsgBox "CLICK"
End Sub

Khi tôi dùng chuột hay dùng phím mũi tên lên xuống, chúng đều xảy ra 2 sự kiện như trên, tức cả 2 đều cho thông báo bằng MsgBox.

Vậy điều gì hoặc khi nào chúng mới khác đi? Chỉ xảy ra đúng một sự kiện?
 

File đính kèm

Upvote 0
đặt gạch để đó cái đã . Đang xem Euro hay , mai suy nghĩ sau . ha ha --=0--=0--=0
 
Upvote 0
Không biết câu hỏi này có "hay" hay là không, nhưng lâu quá không thấy đề tài nào khác nên đố chơi.

Với các dòng code trong UserForm:

Mã:
Option Explicit


Private Sub UserForm_Initialize()
    Dim i As Byte
    For i = 1 To 10
        ListBox1.AddItem i
    Next
End Sub


Private Sub ListBox1_Change()
    MsgBox "CHANGE"
End Sub


Private Sub ListBox1_Click()
    MsgBox "CLICK"
End Sub

Khi tôi dùng chuột hay dùng phím mũi tên lên xuống, chúng đều xảy ra 2 sự kiện như trên, tức cả 2 đều cho thông báo bằng MsgBox.

Vậy điều gì hoặc khi nào chúng mới khác đi? Chỉ xảy ra đúng một sự kiện?
Em nghĩ sẽ xảy ra đúng một sự kiện có lẻ mấu chốt ngay chổ Multiselect của ListBox
 
Upvote 0
Em nghĩ sẽ xảy ra đúng một sự kiện có lẻ mấu chốt ngay chổ Multiselect của ListBox
OK, đây là một đáp án, khi chọn chế độ này nó sẽ không xảy ra sự kiện click.

Thử tìm tiếp xem nó còn cái nào nữa không ta?
 
Upvote 0
OK, đây là một đáp án, khi chọn chế độ này nó sẽ không xảy ra sự kiện click.

Thử tìm tiếp xem nó còn cái nào nữa không ta?

Mã:
Private Sub CommandButton1_Click()


ListBox1.ListIndex = 0
ListBox1.ListIndex = -1


End Sub

Và vẫn còn 1 cái khác nữa , chờ Nghĩa đẹp chai tìm giúp , ha ha +-+-+-++-+-+-++-+-+-+
 
Upvote 0
Đã có 2 đáp án rồi đến anh Nghĩa đẹp zai xuất chiêu đi.
 
Upvote 0
Copy FillColor từ vùng này sang vùng khác

Đầu tiên mời các bạn xem qua topic này:
http://www.giaiphapexcel.com/forum/...aste-màu-nền-của-cell-này-qua-cell-khác-đc-ko
Ở đó người ta muốn copy màu của một vùng nhiều cell (đã được tô nhiều màu) sang vùng khác
Vấn đề khá đơn giản nhưng nếu tôi muốn tăng độ khó của bài toán lên bằng cách giả định rằng có vài cell trong vùng nguồn đã được tô màu bằng CF thì sao? Tức copy toàn bộ màu mà ta nhìn thấy (bất kể được tô bằng cách nào) từ vùng này sang vùng khác
Lâu rồi không thấy ai "náo loạn" topic này hen...
 
Upvote 0
Đầu tiên mời các bạn xem qua topic này:
http://www.giaiphapexcel.com/forum/...aste-màu-nền-của-cell-này-qua-cell-khác-đc-ko
Ở đó người ta muốn copy màu của một vùng nhiều cell (đã được tô nhiều màu) sang vùng khác
Vấn đề khá đơn giản nhưng nếu tôi muốn tăng độ khó của bài toán lên bằng cách giả định rằng có vài cell trong vùng nguồn đã được tô màu bằng CF thì sao? Tức copy toàn bộ màu mà ta nhìn thấy (bất kể được tô bằng cách nào) từ vùng này sang vùng khác
Lâu rồi không thấy ai "náo loạn" topic này hen...

Có giới hạn phiên bản Excel không anh :)
 
Upvote 0
Có giới hạn phiên bản Excel không anh :)

Phiên bản nào tùy bạn! Chấp nhận luôn trường hợp phiên bản cao làm được mà phiên bản trước đó bó tay
---------------------------
Ai chà! Nghe kiểu hỏi thì chắc đã có câu trả lời rồi nhỉ
 
Upvote 0
Phiên bản nào tùy bạn! Chấp nhận luôn trường hợp phiên bản cao làm được mà phiên bản trước đó bó tay
---------------------------
Ai chà! Nghe kiểu hỏi thì chắc đã có câu trả lời rồi nhỉ
Excel 2010 trở lên thì có thể dùng cái này
PHP:
Range.DisplayFormat...
 
Upvote 0
Lâu lâu đào lên cái cho vui
Đố các bạn làm sao gọi được hàm LoadPicture với đường dẫn chứa tiếng Việt có dấu ?
Mã:
Image1.Picture = [COLOR=#ff0000][B]LoadPicture[/B][/COLOR](filename)
Lưu ý nhỏ : không sử dụng các thư viện Window API --=0--=0
 

File đính kèm

Upvote 0
Lâu lâu đào lên cái cho vui
Đố các bạn làm sao gọi được hàm LoadPicture với đường dẫn chứa tiếng Việt có dấu ?
Mã:
Image1.Picture = [COLOR=#ff0000][B]LoadPicture[/B][/COLOR](filename)
Lưu ý nhỏ : không sử dụng các thư viện Window API --=0--=0

Bai này Mạnh sẻ sử dung Fso lấy ShortPath của nó là ok ko phải API cái quái gì hết ....Nói vậy chơi mai mốt Viết hahahahaha


3 dòng code thay cho một mớ API + Hàm sau
Mã:
Function ShortFileName(ByVal LongFileName As String) As String
    Dim buffer As String
    buffer = String(256, Chr(0))
    GetShortPathName StrPtr(LongFileName), StrPtr(buffer), 256
    ShortFileName = buffer
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Bài này Thầy Siwtom đã làm rồi .
 
Upvote 0
Code này là thư viện Window API hả Anh kieu manh:
Mã:
#If VBA7 Then
Private Declare PtrSafe Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#Else
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#End If


Private index As Long


Function ShortFileName(ByVal LongFileName As String) As String
Dim buffer As String
    buffer = String(256, Chr(0))
    GetShortPathName StrPtr(LongFileName), StrPtr(buffer), 256
    ShortFileName = buffer
End Function


Private Sub CommandButton1_Click()
Dim filename As String
    index = (index Mod 2) + 1
    filename = ShortFileName(ThisWorkbook.Path & "\images\" & index & ".jpg")
    Image1.Picture = LoadPicture(filename)
End Sub
 
Upvote 0
Code này là thư viện Window API hả Anh kieu manh:
Mã:
[COLOR=#ff0000]#If VBA7 Then
Private Declare PtrSafe Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#Else
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#End If
[/COLOR]

Private index As Long


[COLOR=#ff0000]Function ShortFileName(ByVal LongFileName As String) As String
Dim buffer As String
    buffer = String(256, Chr(0))
    GetShortPathName StrPtr(LongFileName), StrPtr(buffer), 256
    ShortFileName = buffer
End Function
[/COLOR]

Private Sub CommandButton1_Click()
Dim filename As String
    index = (index Mod 2) + 1
    filename = ShortFileName(ThisWorkbook.Path & "\images\" & index & ".jpg")
    Image1.Picture = LoadPicture(filename)
End Sub

Thì nó đó ...ý Bài #1167 là bỏ hết code màu đỏ đó
 
Upvote 0
Bai này Mạnh sẻ sử dung Fso lấy ShortPath của nó là ok ko phải API cái quái gì hết ....Nói vậy chơi mai mốt Viết hahahahaha


3 dòng code thay cho một mớ API + Hàm sau
Mã:
Function ShortFileName(ByVal LongFileName As String) As String
    Dim buffer As String
    buffer = String(256, Chr(0))
    GetShortPathName StrPtr(LongFileName), StrPtr(buffer), 256
    ShortFileName = buffer
End Function

filename = FSO.GetFile(filename).ShortPath là cách tốt nhất rồi đấy
 
Upvote 0
Code này là thư viện Window API hả Anh kieu manh:
Mã:
#If VBA7 Then
Private Declare PtrSafe Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#Else
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#End If


Private index As Long


Function ShortFileName(ByVal LongFileName As String) As String
Dim buffer As String
    buffer = String(256, Chr(0))
    GetShortPathName StrPtr(LongFileName), StrPtr(buffer), 256
    ShortFileName = buffer
End Function


Private Sub CommandButton1_Click()
Dim filename As String
    index = (index Mod 2) + 1
    filename = ShortFileName(ThisWorkbook.Path & "\images\" & index & ".jpg")
    Image1.Picture = LoadPicture(filename)
End Sub

Hỉnh như cái này là API thì phải
#If VBA7 Then
Private Declare PtrSafe Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#Else
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
#End If
 
Upvote 0
filename = FSO.GetFile(filename).ShortPath là cách tốt nhất rồi đấy

vâng đó chính là cái em muốn lưu trữ lại để xài sau này .
Tánh em hay quên , lại chưa được "nhậu" với anh NDU cách tìm kiếm bài viết trên GPE nên kiếm cớ hỏi đặng có cái lưu trữ . Thông cảm cho em nha anh NDU . +-+-+-++-+-+-+
 
Upvote 0
filename = FSO.GetFile(filename).ShortPath là cách tốt nhất rồi đấy

đúng đó Anh ...nếu Em viết cho Một Sub thì Em Set 1 cái Fso là xong ...

Còn trong một dự Án VB thì Em lại thích viết ra 1 hàm và xài nó cho vài cái khác nữa chẳng Hạn ...
đáp án của Em
Mã:
Private Function GetShortPath(ByVal FilePath As String)
    With CreateObject("Scripting.FileSystemObject")
        GetShortPath = .GetFile(FilePath).ShortPath
    End With
End Function

Private Sub CommandButton1_Click()
    Dim filename As String
    index = (index Mod 2) + 1
    filename = GetShortPath(ThisWorkbook.path & "\images\" & index & ".jpg")
    Image1.Picture = LoadPicture(filename)
End Sub
 
Upvote 0
vâng đó chính là cái em muốn lưu trữ lại để xài sau này .
Tánh em hay quên , lại chưa được "nhậu" với anh NDU cách tìm kiếm bài viết trên GPE nên kiếm cớ hỏi đặng có cái lưu trữ . Thông cảm cho em nha anh NDU . +-+-+-++-+-+-+

Giỡn chơi không! Thấy cái "mẹt" bao giờ đâu mà đòi "nhậu". Ngon thì hứa và hẹn đi --=0
-----------------------------------------------
đúng đó Anh ...nếu Em viết cho Một Sub thì Em Set 1 cái Fso là xong ...

Còn trong một dự Án VB thì Em lại thích viết ra 1 hàm và xài nó cho vài cái khác nữa chẳng Hạn ...
đáp án của Em
Mã:
Private Function GetShortPath(ByVal FilePath As String)
    With CreateObject("Scripting.FileSystemObject")
        GetShortPath = .GetFile(FilePath).ShortPath
    End With
End Function
DỰ ÁN LỚN thì đừng có With.. End With. Tiếc gì mà không Set FSO = CreateObject("Scripting.FileSystemObject") rồi sau đó Set FSO = Nothing
Nói chung đã DỰ ÁN LỚN thì đừng cố viết code cho ngắn mà nên viết rõ ràng
Ai biết đâu tại sao nhưng thấy "người lớn" người ta khuyên làm vậy nên mình "người bé" cứ học theo, mai này "lớn" được bằng người sẽ tính
Ẹc... Ẹc...
 
Upvote 0
Dự án lớn thì các hàm viết nên khai báo kiểu trả về của hàm. Không nên buộc ngừoi dùng phải dựa vào tên hàm để đoán kiểu trả về.

Cái này sẽ giúp cho intellisense dễ đọc hơn.

Vả lại, nối object chỉ 1 dòng thì With làm chi cho mệt. Cứ nối thẳng luôn.
myPath = CreateOjbect(...).Get...
 
Lần chỉnh sửa cuối:
Upvote 0
Dự án lớn thì các hàm viết nên khai báo kiểu trả về của hàm. Không nên buộc ngừoi dùng phải dựa vào tên hàm để đoán kiểu trả về.

Cái này sẽ giúp cho intellisense dễ đọc hơn.

Vả lại, nối object chỉ 1 dòng thì With làm chi cho mệt. Cứ nối thẳng luôn.
myPath = CreateOjbect(...).Get...
Phải chăng ý Bạn là Vầy ...
Mã:
Private Function GetShortPath(FilePath)
    GetShortPath = CreateObject("Scripting.FileSystemObject").GetFile(FilePath).ShortPath
End Function

Sub Main()
    Dim path As String
    path = ThisWorkbook.path & "\1.xlsx"
    MsgBox GetShortPath(path)
End Sub
 
Upvote 0
Bai này Mạnh sẻ sử dung Fso lấy ShortPath của nó là ok ko phải API cái quái gì hết ....
Chỉ ăn tục nói phét là giỏi.
Hay theo dõi xem ta nói có lý không nhé.
Có rất nhiều vấn đề trong cuộc sống mà không ai biết cách giải quyết cho đến tận khi có người chỉ ra. Lúc đó mọi người mới ồ lên: quá đơn giản, quá dễ hiểu, quá hiển nhiên. Nhưng xin nói là chỉ khi có người chỉ ra thì mới thấy "quá đơn giản, quá dễ hiểu, quá hiển nhiên". Khi có người đưa ra ý tưởng rồi thì ai cũng nói phét được.
Vấn đề load ảnh vào Image mà đường dẫn có ký tự Việt có đã bao lâu? Người ta dùng Webbrowser để thay thế Image đã bao lâu? Với Image trên sheet thì bó tay. Suốt thời gian đó có ai mạnh mồm như lúc này không?
Vấn đề không phải là "ai đó biết là có tồn tại hàm GetShortPathName hay ... ShortPath" mà vấn đề ở chỗ "có hay không có Ý TƯỞNG dùng chúng để giải quyết vấn đề". Có người có cả một kho công cụ để làm các việc nhưng có những việc bó tay. Chỉ khi có người chỉ ra hướng đi thì mới "ừ nhỉ, mình cũng có trong kho".

Nói phét thì ai chả nói được. Cái quan trọng là khoảng thời gian mà mọi người bó tay kia. Không ai có ý tưởng dùng cái mà bây giờ lớn tiếng nói phét.

Trong lập trình thì tư duy là quan trọng nhất. Dù công thức hay code thì tư duy vẫn có vai trò quyết định. Từ tư duy sẽ có ý tưởng.

Có thể học mót GetShortPathName hay ... ShortPath và những hàm khác nhưng không có ý tưởng thì lần thứ 2 sẽ lại bó tay ngồi đợi ông chohom khác nào đó để rồi sau đó lại lớn tiếng nói phét.
 
Upvote 0
Chỉ ăn tục nói phét là giỏi.
Hay theo dõi xem ta nói có lý không nhé.
Có rất nhiều vấn đề trong cuộc sống mà không ai biết cách giải quyết cho đến tận khi có người chỉ ra. Lúc đó mọi người mới ồ lên: quá đơn giản, quá dễ hiểu, quá hiển nhiên. Nhưng xin nói là chỉ khi có người chỉ ra thì mới thấy "quá đơn giản, quá dễ hiểu, quá hiển nhiên". Khi có người đưa ra ý tưởng rồi thì ai cũng nói phét được.
Vấn đề load ảnh vào Image mà đường dẫn có ký tự Việt có đã bao lâu? Người ta dùng Webbrowser để thay thế Image đã bao lâu? Với Image trên sheet thì bó tay. Suốt thời gian đó có ai mạnh mồm như lúc này không?
Vấn đề không phải là "ai đó biết là có tồn tại hàm GetShortPathName hay ... ShortPath" mà vấn đề ở chỗ "có hay không có Ý TƯỞNG dùng chúng để giải quyết vấn đề". Có người có cả một kho công cụ để làm các việc nhưng có những việc bó tay. Chỉ khi có người chỉ ra hướng đi thì mới "ừ nhỉ, mình cũng có trong kho".

Nói phét thì ai chả nói được. Cái quan trọng là khoảng thời gian mà mọi người bó tay kia. Không ai có ý tưởng dùng cái mà bây giờ lớn tiếng nói phét.

Trong lập trình thì tư duy là quan trọng nhất. Dù công thức hay code thì tư duy vẫn có vai trò quyết định. Từ tư duy sẽ có ý tưởng.

Có thể học mót GetShortPathName hay ... ShortPath và những hàm khác nhưng không có ý tưởng thì lần thứ 2 sẽ lại bó tay ngồi đợi ông chohom khác nào đó để rồi sau đó lại lớn tiếng nói phét.

Làm gì mà bực bội vậy Anh ...Anh nói chỗ màu đỏ hới quá đáng rồi đó
 
Upvote 0
Làm gì mà bực bội vậy Anh ...Anh nói chỗ màu đỏ hới quá đáng rồi đó

Cũng hơi quá lời. Thành thực xin lỗi.
Nhưng tôi dị ứng với những người quá mạnh miệng. Một khi có người đi tiên phong, vẽ ra hướng đi rồi thì ông nào cũng mạnh miệng được.
 
Upvote 0
Cũng hơi quá lời. Thành thực xin lỗi.
Nhưng tôi dị ứng với những người quá mạnh miệng. Một khi có người đi tiên phong, vẽ ra hướng đi rồi thì ông nào cũng mạnh miệng được.
Em biết mà ...tại Em nói ẩu bài đó thôi ...thôi bỏ qua đi Anh ...Mong lâu lâu Anh viết một code cho Em học với

Mong các Thành Viên GPE không Tám qua Tám lại vấn đề này nữa ...ko vui vẻ gì đâu...

Cảm ơn Anh
 
Upvote 0
Cũng hơi quá lời. Thành thực xin lỗi.
Nhưng tôi dị ứng với những người quá mạnh miệng. Một khi có người đi tiên phong, vẽ ra hướng đi rồi thì ông nào cũng mạnh miệng được.

Chào anh siwtom
Ý tưởng ban đầu là cái đáng được tôn trọng . Tôi làm ra câu hỏi này là dựa trên ý tưởng của anh siwtom , tôi rất trân trọng ý tưởng của anh . Nếu có gây ra sự khó chịu nơi anh thì đó là do sự thiếu minh bạch của tôi vì đã không nêu rõ ý tưởng của anh , không phải do tôi cố ý , nhưng vì tôi không biết những người ở trên lấy ý tưởng đâu ra ? tôi không áp đặt được . Nhưng tôi vẫn nhận sai với anh , mong anh bỏ qua . Tôi không muốn vì chuyện này mà mọi chuyện lại đi xa hơn theo chiều hướng căng thẳng hơn .
 
Upvote 0
Chào anh siwtom
Ý tưởng ban đầu là cái đáng được tôn trọng . Tôi làm ra câu hỏi này là dựa trên ý tưởng của anh siwtom , tôi rất trân trọng ý tưởng của anh . Nếu có gây ra sự khó chịu nơi anh thì đó là do sự thiếu minh bạch của tôi vì đã không nêu rõ ý tưởng của anh , không phải do tôi cố ý , nhưng vì tôi không biết những người ở trên lấy ý tưởng đâu ra ? tôi không áp đặt được . Nhưng tôi vẫn nhận sai với anh , mong anh bỏ qua . Tôi không muốn vì chuyện này mà mọi chuyện lại đi xa hơn theo chiều hướng căng thẳng hơn .

OK ...vậy là tốt rồi cẳng thẳng mệt lắm +-+-+-+--=0....cảm ơn Bạn

Mạnh cũng nhận Sai là Phát Ngôn ẩu gây xốc bài #1168.....Rút kinh nghiệm lần sau phát ngôn lại
 
Lần chỉnh sửa cuối:
Upvote 0
đúng đó Anh ...nếu Em viết cho Một Sub thì Em Set 1 cái Fso là xong ...

Còn trong một dự Án VB thì Em lại thích viết ra 1 hàm và xài nó cho vài cái khác nữa chẳng Hạn ...
đáp án của Em
Mã:
Private Function GetShortPath(ByVal FilePath As String)
    With CreateObject("Scripting.FileSystemObject")
        GetShortPath = .GetFile(FilePath).ShortPath
    End With
End Function

Private Sub CommandButton1_Click()
    Dim filename As String
    index = (index Mod 2) + 1
    filename = GetShortPath(ThisWorkbook.path & "\images\" & index & ".jpg")
    Image1.Picture = LoadPicture(filename)
End Sub
Sử dụng có 1 dòng code dùng With hay Set làm quái gì cho mệt đồng chí ơi! Như vầy luôn cho gọn:

CreateObject("Scripting.FileSystemObject").GetFile(FilePath).ShortPath


P/s: Viết xong mới thấy bài viết này:

Dự án lớn thì các hàm viết nên khai báo kiểu trả về của hàm. Không nên buộc ngừoi dùng phải dựa vào tên hàm để đoán kiểu trả về.

Cái này sẽ giúp cho intellisense dễ đọc hơn.

Vả lại, nối object chỉ 1 dòng thì With làm chi cho mệt. Cứ nối thẳng luôn.
myPath = CreateOjbect(...).Get...
 
Lần chỉnh sửa cuối:
Upvote 0
Sử dụng có 1 dòng code dùng With hay Set làm quái gì cho mệt đồng chí ơi! Như vầy luôn cho gọn:

CreateObject("Scripting.FileSystemObject").GetFile(FilePath).ShortPath


P/s: Viết xong mới thấy bài viết này:
Thì bài #1179 viết rồi đó
Mã:
Private Function GetShortPath(FilePath)
    GetShortPath = CreateObject("Scripting.FileSystemObject").GetFile(FilePath).ShortPath
End Function

Lâu này nghĩa đi pháp À ...thấy văng vắng--=0
 
Upvote 0
Xin đố các bạn là làm sao đếm được trên máy mình mở bao nhiêu Excel section (Có nghĩa là trong các workbook đó mình không thể nhìn thấy trong Switch Windows)?
 
Upvote 0
Xin đố các bạn là làm sao đếm được trên máy mình mở bao nhiêu Excel section (Có nghĩa là trong các workbook đó mình không thể nhìn thấy trong Switch Windows)?

Muốn code gì thì cũng phải thử nghiệm. Ác cái là từ ngày mình dung Windows 10 + Office 2016, mình không biết cách nào để mở 2 sessions excel (trước đây làm chuyện này dễ dàng bằng cách cứ bấm Start, chọn biểu tượng Excel là có ngay 1 session mới)
 
Upvote 0
Muốn code gì thì cũng phải thử nghiệm. Ác cái là từ ngày mình dung Windows 10 + Office 2016, mình không biết cách nào để mở 2 sessions excel (trước đây làm chuyện này dễ dàng bằng cách cứ bấm Start, chọn biểu tượng Excel là có ngay 1 session mới)

anh ơi cho em hỏi , session excel là gì ạ ? thật sự em không biết . Từ chỗ biết mới tìm cách giải được chứ ạ . +-+-+-+ +-+-+-+
 
Upvote 0
anh ơi cho em hỏi , session excel là gì ạ ? thật sự em không biết . Từ chỗ biết mới tìm cách giải được chứ ạ . +-+-+-+ +-+-+-+

Bấm Ctrl + Alt + Del, xem trong Task Manager, thấy xuất hiện 2 thằng Excel.exe thì gọi là 2 sessions
Với người dùng thông thường thì có cách nhận dạng đơn giản: Nếu 2 files được mở bằng 2 sessions thì file này sẽ không thể tham chiếu đến file kia (từ file này gõ dấu = vào 1 cell sẽ không thể tham chiếu được với bất cứ cell nào của file kia)
 
Lần chỉnh sửa cuối:
Upvote 0
Muốn code gì thì cũng phải thử nghiệm. Ác cái là từ ngày mình dung Windows 10 + Office 2016, mình không biết cách nào để mở 2 sessions excel (trước đây làm chuyện này dễ dàng bằng cách cứ bấm Start, chọn biểu tượng Excel là có ngay 1 session mới)

Anh thử cách sau:
Vào RUN gõ: excel /x rồi enter

Xin đố các bạn là làm sao đếm được trên máy mình mở bao nhiêu Excel section (Có nghĩa là trong các workbook đó mình không thể nhìn thấy trong Switch Windows)?
Ở workbook nào đó thì khi vào Switch Windows không thấy workbook khác, chỉ thấy chính nó.
 
Upvote 0
Upvote 0

Cũng được nhưng mà dài quá!
Ở topic khác thì file của bạn xem được đạt yêu cầu nhưng ở đây là đố vui nên phải có gì đó độc đáo hoặc ít nhất là ngắn gọn
(tôi làm bài này chỉ với 4 dòng code nhưng vẫn không chắc nó có "vui" hoặc "độc đáo" không nữa)
 
Upvote 0
Cũng được nhưng mà dài quá!
Ở topic khác thì file của bạn xem được đạt yêu cầu nhưng ở đây là đố vui nên phải có gì đó độc đáo hoặc ít nhất là ngắn gọn
(tôi làm bài này chỉ với 4 dòng code nhưng vẫn không chắc nó có "vui" hoặc "độc đáo" không nữa)

mình chơi nốt nhạc vui đi anh : 3 dòng . (có bao gồm sub và end Sub ) +-+-+-++-+-+-+ +-+-+-+
 
Upvote 0
Cũng được nhưng mà dài quá!
Ở topic khác thì file của bạn xem được đạt yêu cầu nhưng ở đây là đố vui nên phải có gì đó độc đáo hoặc ít nhất là ngắn gọn
(tôi làm bài này chỉ với 4 dòng code nhưng vẫn không chắc nó có "vui" hoặc "độc đáo" không nữa)

Cảm ơn anh. Em chỉ mần được vậy thôi.

Hóng bài của anh...
 
Upvote 0
Xin đố các bạn là làm sao đếm được trên máy mình mở bao nhiêu Excel section (Có nghĩa là trong các workbook đó mình không thể nhìn thấy trong Switch Windows)?

cuối năm giải quyết hàng tồn còn đi ăn tết , ý anh là đếm coi có bao nhiêu process đang chạy có tên là excel.exe ? vậy ta dùng lệnh

Mã:
GetObject("winmgmts:").ExecQuery("Select * from Win32_Process Where Name = 'EXCEL.EXE'").Count
 
Upvote 0

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

Back
Top Bottom