Tổng hợp hỏi đáp về excel (theo pcworld) (1 người xem)

Liên hệ QC

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

skyonline

Thành viên thường trực
Thành viên danh dự
Tham gia
21/7/06
Bài viết
276
Được thích
646
Nghề nghiệp
Sinh Vien
Không biết mấy vấn đề này đã trùng chưa? Nếu trùng thì post lên chắc cũng không sao để mọi người chú ý hơn.

Hỏi: Dùng hàm VLOOKUP, khi thông số "lookup_value" không có thì kết quả trả về là: #N/A. Có cách nào để thiết lập hàm tự động tìm thông số "lookup_value" ở một sheet khác khi không tìm thấy ở sheet hiện hành?



Đáp: Hàm VLookup (hay bất kỳ hàm thư viện nào khác) đều có đặc tả chức năng rõ ràng và xác định, người dùng phải hiểu và sử dụng đúng theo đặc tả của hàm. Bạn tra cứu tài liệu chỉ dẫn về hàm VLookup thì sẽ biết rõ rằng nếu dò tìm không có (và nếu tham số thứ tư của hàm là False) thì hàm sẽ trả về mã lỗi "#N/A". Nếu muốn tìm tiếp 1 hay nhiều sheet khác khi chưa tìm được trong sheet hiện hành, bạn có thể viết 1 hàm user-defined cho riêng mình. Thí dụ hàm MyVLookup do chúng tôi viết như sau:

'Hàm MyVlookup có danh sách tham số y như VLookup
Public Function MyVLookup(val As Variant, r As Range, c As Integer, flag As Boolean) As Variant
'gọi VLookup
MyVLookup = Application.VLookup(val, r, c, flag)
'kiểm tra xem có lỗi không, nếu có trả về 0
If IsError(MyVLookup) Then MyVLookup = 0
End Function

Nếu bạn đặt hàm trên trong 1 file add-ins (thí dụ file *.xla) rồi add vào Excel thì bạn có thể gọi nó ở bất kỳ tài liệu Excel nào. Còn nếu bạn đặt hàm trong 1 module VBA trong file Excel của bạn thì chỉ có file Excel đó dùng được hàm trên thôi.

Bảng dữ liệu Excel có 3 mã hàng: A, B, C. Mỗi mã hàng có 3 loại hàng (1, 2, 3). Cụ thể hàng A1 giá 5000, A2 giá 4500, A3 giá 4000, B1 giá 3000, B2 giá 2500, B3 giá 2000, C1 giá 1000, C2 giá 500, C3 giá 100. Cột A2 có dữ liệu ngẫu nhiên như A1, B2, C3, A3, C3, A1, B1... Cần tính giá trị cột B2 dựa vào bảng dữ liệu và cột A2.
Vấn đề mà bạn cần giải quyết có thể giải quyết bằng các thao tác sau:
• nhập vào bảng tra, bảng này có 9 hàng, mỗi hàng có 2 cột: cột mã hàng và cột giá cả. Giả sử bạn nhập bảng này vào vùng cell từ E1 đến F9.
• nhập danh sách mã hàng cần tính tiền vào 1 cột nào đó, giả sử cột A từ hàng 1.
• nhập công thức tính tiền như sau vào từng cell ở cột tính tiền, thí dụ cột B:
=VLOOKUP(A1,$E$1:$F$9,2)
Lưu ý chỉ cần nhập công thức trên vào cell đầu tiên, sau đó dùng chức năng Copy/Paste để dán công thức vào các cell còn lại của cột tính tiền.
 
Hỏi: Xin chỉ giúp tôi có cách nào so sánh nội dung giữa 2 cột trong Excel. Nếu giống nội dung thì in ra cột thứ 3 là giống, khác thì in là khác.



Đáp:

Website Microsoft Assistance hướng dẫn rất chi tiết cách sử dụng Excel để so sánh dữ liệu trong Microsoft Excel. Bạn dùng từ khóa compare để tìm sẽ được kết quả sau: Use Excel to compare two lists of data
 
Hỏi: 1. Có hàm Excel nào đếm được số lượng trong bảng tính theo nhiều điều kiện, ví dụ: cần đếm số học sinh nữ và dân tộc K'Ho có điểm trung bình từ 5 đến 6. Trong bảng tính đã có các cột Stt: Họ tên học sinh; dân tộc; giới tính; d1, d2, ĐTB.
2. Tạo macro hay cái gì khác để giấu công thức trong Excel không cho người khác nhìn thấy và sửa chữa nó.
3. Tạo một button khi nhấn vào nó sẽ mở ra một sheet (Sheet đó đã bị giấu, bình thường thì không thấy), hoặc vô hiệu sheet đó.



Đáp: 1. Excel có cung cấp hàm tên là CountIf() để đếm số lượng cell thỏa mãn 1 điều kiện nào đó, tuy nhiên khả năng của hàm này không đủ sức giải quyết vấn đề bạn đặt ra. Cách khắc phục là định nghĩa 1 hàm user-defined bằng VBA thực hiện chức năng mà bạn muốn. Cụ thể bạn hãy tiến hành các thao tác sau:

- chạy Excel, mở file Excel chứa danh sách học sinh (gồm nhiều hàng, mỗi hàng 7 cột thông tin của từng học sinh như bạn trình bày). Giả sử danh sách được nhập từ cell đầu tiên là A1 của bảng tính.
- vào menu Tools.Macro.Visual Basic Editor để mở cửa sổ soạn code VBA. Ấn phải chuột trong cửa sổ Project, chọn menu Insert.Module để tạo ra Module VBA mới (tên mặc định là Module1) rồi nhập hàm đếm số record thỏa mãn yêu cầu của bạn như sau:

'hàm có 4 tham số theo yêu cầu của bạn
Function MyCount(rng As Range, dantoc As String, gioitinh As String, tbmin As Double, tbmax As Double) As Integer
'Khai báo các biến cần dùng
Dim count As Integer
Dim i As Integer
Dim tdb As Double
'khởi động số lượng ban đầu
count = 0
'duyệt xử lý từng học sinh trong danh sách
For i = 1 To rng.count
'xác định điểm TB của học sinh từ cell tương ứng
dtb = CDbl(rng.Item(i, 7))
'kiểm tra các điều kiện cần thỏa mãn
If (dantoc = rng.Item(i, 3).Value) And (gioitinh = rng.Item(i, 4).Value) And (tbmin <= dtb) And (dtb <= tbmax) Then
'tìm thỏa thì tăng số lượng đếm
count = count + 1
End If
'trả về số lượng đếm được
MyCount = count
Next i
End Function
- quay về bảng tính Excel ban đầu, dời chuột về 1 cell nào đó mà bạn muốn chứa số lượng học sinh thỏa mãn điều kiện rồi nhập thử công thức sau:
=MyCount(A1:G100,"K'No","Nu", 5.0, 6.0)
Tóm lại nhờ hàm MyCount() ở trên, bạn có thể đếm số lượng học sinh thỏa mãn điều kiện tổng quát hơn: các học sinh thuộc 1 dân tộc nào đó; thuộc phái nào đó và có điểm TB nằm trong phạm vi nào đó.

2. và 3. Việc giấu công thức hay worksheet nào đó thuộc bài toán tổng quát hơn nhiều, đó là bài toán an toàn thông tin. Có 3 vấn đề lớn trong an toàn thông tin, đó là bảo mật, toàn vẹn & nhất quán dữ liệu, sẵn sàng đáp ứng. Trong 3 vấn đề trên, vấn đề bảo mật thường được người dùng quan tâm nhất. Thí dụ thông tin của bạn là file Excel chứa các bảng dữ liệu cùng các module source code xử lý, bạn muốn chỉ có những người dùng nhất định mới được truy xuất file Excel, mỗi người có 1 số quyền truy xuất riêng biệt... Cách chính qui nhất để bảo mật thông tin là hãy để hệ điều hành giải quyết, ứng dụng không nên giải quyết thêm. Hiện WinXP đã giải quyết tốt vấn đề bảo mật thông tin thông qua cơ chế xác nhận người dùng nhờ thông tin account tương ứng, ai có account nào thì được quyền truy xuất các tài nguyên qui định bởi account đó, ai không có account thì không thể vào được WinXP và như thế không thể chạy Excel để truy xuất các file Excel được.
 
Hỏi: Tôi vô tình xóa mất một sheet liên kết trong Excel, làm sao để phục hồi lại sheet này.



Đáp: Bạn không nói rõ là đã xóa mối liên kết đến sheet hay xóa vật lý sheet đó, nhưng nếu bạn đã dùng lệnh "Save" để lưu kết quả lên file thì không thể "undo" các động tác đã thực hiện. Bây giờ muốn khôi phục lại trạng thái cũ thì tùy trường hợp: nếu xóa mối liên kết đến sheet thì hãy tạo lại mối liên kết đó (đây là công việc khá dễ dàng), còn nếu đã xóa vật lý sheet thì phải tạo lại sheet này, nhưng đây là công việc rất nặng nề.
 
Hỏi: Xin hướng dẫn cách tạo 1 buton trong Excel, khi nhấn chuột vào nó sẽ làm thay đổi nội dung của 1 cell được chỉ định trước.



Đáp: Để giải quyết yêu cầu của bạn, bạn hãy thực hiện lần lượt các công việc sau:
1. Chạy Excel, chọn menu Tools.Macro.Macros để hiển thị cửa sổ quản lý macro của Excel. Nhập tên macro mới của bạn (td. Mymacro1), ấn button Create để tạo mới macro này. Khi cửa sổ soạn code VBA của macro hiển thị, bạn hãy viết code miêu tả chức năng mong muốn. Dĩ nhiên bạn phải nắm vững cú pháp ngôn ngữ VBA và yêu cầu cụ thể mà mình muốn thực hiện bởi macro. Sau khi viết code macro xong, bạn chọn menu File.Close and return to Excel để quay về cửa sổ Excel. Thí dụ macro sau sẽ tăng giá trị của cell hiện hành lên 1 đơn vị:

Sub MyMacro1()
ActiveCell.Value = 1+ CInt(ActiveCell.Value)
End Sub

2. Vào menu View.Toolbars.Customize để hiển thị cửa sổ Customize, chọn tab Commands để hiển thị danh sách Command, duyệt tìm trong danh sách và chọn mục Macros để hiển thị các macro hiện có. Duyệt, chọn mục "Custom Button" trong danh sách, ấn giữ nó và drag về vị trí mong muốn trong Toolbar nào đó của Excel để tạo button mới, đóng cửa sổ customize lại.

3. Khi bạn ấn trái chuột lần đầu trên button vừa tạo, Excel sẽ hiển thị danh sách macro hiện hành để bạn chọn 1 macro kết hợp với button. Từ đây trở đi, mỗi lần bạn ấn chuột trên button mới, macro tương ứng sẽ tự động chạy.
 
Hỏi: Bảng tính Excel có 1000 dòng thống kê về số lần lỗi của nhiều thiết bị, trong đó mỗi thiết bị chiếm 10 dòng (thống kê trong 10 giờ), ví dụ:

Loại thiết bị Giờ Số lần lỗi
A1 2 10
A2 3 8
B1 2 2
B2 3 7
A1 3 15
A2 4 7
B1 5 6
B2 6 2

Xin hướng dẫn viết macro tìm giờ có số lỗi cao nhất và in ra 1 sheet (của tất cả các thiết bị).



Đáp: Bài toán của bạn thật ra chưa cần phải viết macro vì Excel đã cung cấp sẵn chức năng để giải quyết trực tiếp. Thí dụ bảng thống kê của bạn được chứa trong 1000 dòng và dùng 3 cột A, B, C nằm ngay dưới dòng tiêu đề, bạn hãy thực hiện các thao tác sau để thực hiện yêu cầu của mình: chọn vùng gồm 1000 dòng dữ liệu trong 3 cột, chọn menu Data.Sort, khi cửa sổ Sort hiển thị, bạn chọn cột 'Loại thiết bị' trong listbox 'Sort by' với tiêu chuẩn 'Ascending', chọn cột 'Số lần lỗi' trong listbox 'Then by' kế tiếp với tiêu chuẩn 'Descending' rồi nhấn button Ok, vùng chọn sẽ được sắp xếp lại theo thứ tự tăng dần dữ liệu trong cột 'Loại thiết bị', các dòng dữ liệu của 1 thiết bị sẽ được để liên tiếp nhau, trong đó dòng đầu tiên của từng thiết bị sẽ miêu tả số lần lỗi max của thiết bị đó cùng giờ xuất hiện lỗi tương ứng:

Loại thiết bị Giờ Số lần lỗi
A1 3 15
A1 2 10
A2 3 8
A2 4 7
B1 5 6
B1 2 2
B2 3 7
B2 6 2

Nếu bạn dùng chức năng 'Record New Macro' để ghi nhận lại các thao tác trên thì macro được tạo ra tương ứng sẽ như sau:

Sub SortErrorMax()
'chọn vùng dữ liệu cần sắp xếp
Range('A2:C1001').Select
'thực hiện sắp xếp theo tiêu chuẩn mong muốn
Selection.Sort Key1:=Range('A2'), Order1:=xlAscending, Key2:=Range('C2'), Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:= False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 :=xlSortNormal
End Sub

Lưu ý nếu muốn giữ lại bản dữ liệu nguyên thủy, bạn nên copy nó rồi dán thành 1 bản khác (tốt nhất là trên 1 Sheet khác) rồi thực hiện các thao tác trên bản copy.
 
Hỏi:

Bảng tính Excel có nhiều biểu đồ và công thức, tôi muốn “save as” sang 1 file khác, vẫn giữ nguyên kết quả và biểu đồ nhưng các công thức hoặc biểu đồ không còn tác dụng với một số liệu đầu vào mới, có được không?



Đáp: Về nguyên tắc là không được vì mỗi khi bạn thay đổi giá trị của 1 cell nào đó trong bảng tính, Excel sẽ tự duyệt tìm tất cả các cell và các đối tượng khác có dùng giá trị của cell vừa bị thay đổi rồi cập nhật chúng. Trong trường hợp muốn cố định giá trị của 1 cell chứa công thức hay biểu đồ nào đó, bạn phải thực hiện thủ công các thao tác sau:

• Nếu đó là cell chứa công thức, bạn chọn nó, thực hiện lệnh copy rồi Paste Special.Values để dán lại giá trị hiện hành (công thức của cell đã bị mất vĩnh viễn).
• Nếu đó là biểu đồ, bạn dùng trình Screen Capture để copy biểu đồ thành ảnh bitmap rồi dán lại biểu đồ gốc, như vậy từ đây trở đi biểu đồ chỉ là ảnh bitmap thô nên sẽ không bị cập nhật tự động bởi Excel nữa.
 
Hỏi: Tôi cần tạo 1 đoạn mã macro trong Excel để vẽ biểu đồ từ nguồn dữ liệu của 1 bảng tính cho trước nhưng vì nguồn dữ liệu trong bảng tính lại thay đổi về số hàng cón trong biểu đồ tôi chỉ muốn xuất hiện những dữ liệu có thông số, tuy nhiên việc này không thực hiện được khi tôi thay số hàng cụ thể bằng 1 biến. Ví dụ: ActiveChart.SeriesCollection(1).Select ActiveChart.SetSourceData Source:=Sheets("SAP").Range("AD1:AE12,AG1:AG12"), PlotBy:=xlColumns
Tôi muốn thay đoạn nguồn dữ liệu này bằng vd:range(cells(1,1),cells(m,5)) trong đó m là biến đã khai báo trước đó. Xin hướng dẫn.



Đáp: Sức mạnh của lập trình là ở chỗ dùng biến để miêu tả dữ liệu cần xử lý, do đó bất kỳ lệnh nào của ngôn ngữ nào cũng cho phép dùng biến để miêu tả dữ liệu cần xử lý, còn hằng chỉ là trường hợp đặc biệt của biến mà thôi. Thí dụ bạn có thể miêu tả nguồn dữ liệu của 1 biểu đồ Excel bằng 1 vùng cell biến đổi theo trị các biến, cụ thể bạn có thể dùng các lệnh sau:

'khai báo các biến miêu tả góc trên trái của vùng cell cần vẽ
Dim row1 As Integer, col1 As Integer
'khai báo các biến miêu tả góc dưới phải của vùng cell cần vẽ
Dim row2 As Integer, col2 As Integer
'thiết lập các giá trị theo yêu cầu
'thí dụ vùng vẽ từ A1: B4
row1 = 1: col1 = 1: row2 = 4: col2 = 2
'tạo biểu đồ
Charts.Add
'thiết lập các thuộc tính biểu đồ
ActiveChart.ChartType = xl3DColumnClustered
ActiveChart.SetSourceData Source:= Sheets('SAP').Range( Sheets('SAP').

Cells(row1, col1), Sheets("SAP").Cells(row2, col2)), PlotBy:= xlColumns
...
Lưu ý bạn nên dùng thuộc tính Range và Cells trên đối tượng tường minh là Sheet("SAP") của bạn (worksheet chứa dữ liệu vẽ).
 
Hỏi: Tôi làm rất nhiều phương trình phản ứng (PTPƯ) hoá học bằng Excel, chất tham gia hiển thị lần lượt trong các cột “chất 1”, “chất 2” và “chất 3”, còn chất tạo thành hiển thị trong cột “sản phẩm”. Làm thế nào để tìm một PTPƯ tương ứng với các chất trong cột “chất 1”,”chất 2” hoặc cả 3 cột, kết quả tìm được có thể cho ở bất cứ ô nào.



Đáp:

Bạn không trình bày rõ yêu cầu cần giải quyết nên chúng tôi không thể trả lời chính xác. Theo thông tin mà bạn trình bày, bạn chỉ có thông tin về các chất hóa học trong 3 cột và sản phẩm trong cột thứ 4, còn thông tin về các phương trình phản ứng hóa học sử dụng các chất hóa học này lại không được miêu tả. Không biết mỗi bộ 3 chất hóa học thành phần ở 1 hàng nào đó có thể tạo ra bao nhiêu phương trình phản ứng hóa học, cụ thể các phương trình phản ứng này như thế nào?

Giả sử bài toán được phát biểu lại rõ ràng như sau: mỗi bộ 3 chất hóa học ở 1 hàng sẽ tạo ra đúng 1 phương trình phản ứng hóa học để cho ra sản phẩm ở cột “Sản phẩm” tương ứng. Nếu biết 1 hay 2 hay cả 3 chất thành phần làm sao tìm được các PTPƯ có dùng các chất thành phần được biết, rồi hiển thị chỉ số hàng tương ứng trong bảng cho người dùng biết.

Để giải quyết bài toán được chúng tôi phát biểu lại như trên, bạn có thể viết và dùng hàm user-defined bằng ngôn ngữ VBA như sau:

‘Hàm tìm PTPU
Function TimPTPU(rng As Range, chat1 As String, chat2 As String, chat3 As String) As String
‘Khai báo các biến cần dùng
Dim count As Integer
Dim i As Integer
‘ tìm số hàng chứa PTPU
count = rng.count
‘duyệt xử lý từng hàng
For i = 1 To count
If (Len(chat1) <> 0) And (Len(chat2) <> 0) And (Len(chat3) <> 0) Then
‘trường hợp có cả 3 chất
If (chat1 = rng.Item(i, 1).Value) And (chat2 = rng.Item(i, 2).Value) And (chat3 = rng.Item(i, 3).Value) Then
‘tìm được, hiển thị form thông báo
MsgBox “Tìm được PTPU ở hàng “ & (rng.Row + i - 1)
End If
ElseIf (Len(chat1) <> 0) And (Len(chat2) <> 0) Then
‘trường hợp có 2 chất: chat1 và chat2
If (chat1 = rng.Item(i, 1).Value) And (chat2 = rng.Item(i, 2).Value) Then
MsgBox “Tìm được PTPU ở hàng “ & (rng.Row + i - 1)
End If
ElseIf (Len(chat1) <> 0) And (Len(chat3) <> 0) Then
‘trường hợp có 2 chất: chat1 và chat3
If (chat1 = rng.Item(i, 1).Value) And (chat3 = rng.Item(i, 3).Value) Then
MsgBox “Tìm được PTPU ở hàng “ & (rng.Row + i - 1)
End If
ElseIf (Len(chat2) <> 0) And (Len(chat3) <> 0) Then
‘trường hợp có 2 chất: chat2 và chat3
If (chat2 = rng.Item(i, 2).Value) And (chat3 = rng.Item(i, 3).Value) Then
MsgBox “Tìm được PTPU ở hàng “ & (rng.Row + i - 1)
End If
ElseIf (Len(chat1) <> 0) Then
‘trường hợp có 1 chất: chat1
If (chat1 = rng.Item(i, 1).Value) Then
MsgBox “Tìm được PTPU ở hàng “ & (rng.Row + i - 1)
End If
ElseIf (Len(chat2) <> 0) Then
‘trường hợp có 1 chất: chat2
If (chat2 = rng.Item(i, 2).Value) Then
MsgBox “Tìm được PTPU ở hàng “ & (rng.Row + i - 1)
End If
ElseIf (Len(chat3) <> 0) Then
‘trường hợp có 1 chất: chat3
If (chat3 = rng.Item(i, 3).Value) Then
MsgBox “Tìm được PTPU ở hàng “ & (rng.Row + i - 1)
End If
End If
Next i
TimPTPU = “”
End Function

Nếu bạn đặt hàm TimPTPU ở trên trong Module1 của bảng tính Excel chứa bảng số liệu các chất hóa học, thì mỗi khi muốn kích hoạt hàm này chạy từ bảng tính Excel, bạn chỉ cần chọn 1 cell trống nào đó và nhập vào công thức có dạng sau:
=TimPTPU(A1:A100,”Benzen”,””,”Oxy”)
trong đó A1:A100 xác định phạm vi dữ liệu của cột đầu tiên của bảng số liệu, nếu chất nào không cần xác định thì miêu tả chuỗi “” cho nó.
 
Hỏi: Tôi có file Excel với các cột: Họ và tên, Địa chỉ, Số điện thoại... Xin hỏi cách chuyển cơ sở dữ liệu này vào dữ liệu Address Book của Windows XP?



Đáp: Về cơ bản, bạn có thể dùng tiện ích “Address book” của WinXP để quản lý danh sách “Address book” của WinXP. Tiện ích “Address book” cho phép import/export dữ liệu từ/tới nhiều định dạng khác nhau, trong đó định dạng cơ bản nhất là văn bản thô. Tuy nhiên để tiện ích “Address book” hiểu được các thông tin trong 1 database nào đó (như Excel) thì worksheet Excel của bạn cần tuân thủ một số qui định, thí dụ mỗi hàng (record) Excel chỉ nên chứa các field được hiểu bởi “Address book” như “First Name”, “Last Name”... Để có thể tạo được 1 worksheet Excel chứa đúng những thông tin mà trình “Address book” hiểu, bạn có thể tiến hành tuần tự các thao tác sau đây:

1. chạy tiện ích “Address book” (bằng cách chọn Start.All Programs.Accessories.Address book), nếu hiện tại chưa có 1 record thông tin nào thì bạn hãy chọn menu File.New contact... rồi nhập vào 1 số thông tin cho đối tác mong muốn.

2. chọn menu File.Export.Other Address book để hiển thị cửa sổ “Address book Export Tool”, chọn mục “Text File”, chọn button “Export” và xác định file văn bản chứa kết quả. Khi cửa sổ CSW Export hiển thị, bạn hãy đánh dấu chọn vào tất cả các mục trong danh sách rồi chọn button Finish để chương trình xuất thông tin ra file qui định. Nếu bạn dùng WordPad mở file văn bản kết quả ra xem thì sẽ thấy nhiều hàng, hàng đầu gồm nhiều tên field cách nhau bởi dấu phẩy, mỗi hàng còn lại miêu tả 1 account đối tác. Bạn không nên hiệu chỉnh trực tiếp file này vì dễ nhầm lẫn.

3. chạy Excel, chọn menu File.Open, xác định file văn bản cần mở, khi cửa sổ “Text Import Wizard” hiển thị, bạn hãy đánh dấu chọn option “Delimited”, chọn button “Next”, chọn checkbox “Comma”, bỏ chọn checkbox “Tab” rồi chọn button Finish. Excel sẽ hiển thị thông tin trên 1 worksheet, hàng đầu chứa các tên field, các hàng còn lại mỗi hàng chứa thông tin của 1 đối tác. Bạn có thể thêm, bớt, hiệu chỉnh các cell thông tin theo ý muốn. Khi hoàn thành quá trình cập nhật thông tin, bạn chọn menu File.Save As để lưu kết quả theo định dạng text file ban đầu.

4. chạy lại tiện ích “Address book”, chọn menu File.Import.Other Address book để hiển thị cửa sổ “Address book Import Tool”, chọn mục “Text File”, chọn button “Import” và xác định file văn bản chứa thông tin cần Import rồi chọn button Next, Finish để import các thông tin từ file văn bản vào.
 
Hỏi: Xin hỏi làm cách nào để hàm vlookup trong Excel có thể trả về giá trị 0 nếu như giá trị dò không có, tôi đã thử lồng vào hàm if nhưng không được, trong mọi trường hợp nếu vlookup dò không có giá trị đều trả về là #N/A.




Đáp: Hàm VLookup (hay bất kỳ hàm thư viện nào khác) đều có đặc tả chức năng rõ ràng và xác định, người dùng phải hiểu và sử dụng đúng theo đặc tả của hàm. Thí dụ nếu bạn tra cứu tài liệu chỉ dẫn về hàm VLookup thì sẽ biết rõ rằng nếu dò tìm không có (và nếu tham số thứ tư của hàm là False) thì hàm sẽ trả về mã lỗi “#N/A”. Lưu ý rằng nếu chọn giá trị 0 để báo lỗi như bạn đề nghị thì không tổng quát vì giá trị 0 có thể trùng với kết quả tìm được. Tuy nhiên để giải quyết yêu cầu của bạn, cách thông thường là định nghĩa 1 hàm user-defined mới có đặc tả y như hàm VLookup rồi hiệu chỉnh lại mã lỗi “#N/A” về 0. Thí dụ hàm MyVLookup do chúng tôi viết như sau:
‘Hàm MyVlookup có danh sách tham số y như VLookup
Public Function MyVLookup(val As Variant, r As Range, c As Integer, flag As Boolean) As Variant
‘gọi VLookup
MyVLookup = Application.VLookup(val, r, c, flag)
‘kiểm tra xem có lỗi không, nếu có trả về 0
If IsError(MyVLookup) Then MyVLookup = 0
End Function
Nếu bạn đặt hàm trên trong 1 file add-ins (thí dụ file *.xla) rồi add vào Excel thì bạn có thể gọi nó ở bất kỳ tài liệu Excel nào. Còn nếu bạn đặt hàm trong 1 module code của 1 tài liệu Excel thì chỉ có tài liệu Excel đó dùng được thôi.
 
Trước khi Post hết em cũng có một số ý kiến như sau :
Tất cả các bài viết trên đây đều là copy và paste từ tạp chí pcworld . Em cũng chưa kiểm tra có gì mong anh chị bỏ qua.
Vấn đề về "đạo bài" cũng mong các anh chị bỏ qua bởi vì em nghĩ nhưng vấn đề đó tuy không do mình nghĩ ra nhưng cũng có rất nhiều người cần. Tài nguyên trên internet là vô hạn chắc chắn những người đặt ra những câu hỏi này cũng như những người trả lời họ cũng sẽ vui lòng cho phép điều này. Thanks!
 
Hỏi: Sử dụng Excel để tính điểm các đội bóng nhưng không biết lệnh để xếp các đội theo thứ tự từ lớn đến bé ở cột điểm.




Đáp: Tùy theo yêu cầu cụ thể mà bạn có thể chọn 1 trong 2 phương án sau:

Phương án dùng chức năng Data.Sort để sắp xếp vật lý các đội bóng theo thứ tự hạng từ cao đến thấp (hay từ thấp đến cao). Thí dụ ta có bảng điểm của 5 đội bóng như sau:
1. Chọn vùng cell B2:C6 miêu tả các thông tin cần sắp xếp lại. Chọn menu Data.Sort, khi cửa sổ Sort hiển thị, bạn chọn mục “Điểm” trong listbox “Sort by”, chọn option “Descending” rồi chọn button OK, hình sau minh họa trạng thái của các cửa sổ liên quan trong khi bạn thiết lập các tham số sắp xếp:
Kết quả của việc sắp xếp lại danh sách như sau. (lưu ý cột số thứ tự cũng chính là cột miêu tả hạng của từng đội bóng):
2. Phương án dùng hàm Rank() để tính hạng các đội bóng theo thứ tự hạng từ cao đến thấp (hay từ thấp đến cao). Thí dụ với bảng điểm của 5 đội bóng như trên, bạn hãy tạo thêm cột hạng (ở cột D sau cột điểm), đưa cursor về cell D2 (miêu tả hạng của đội bóng đầu tiên là “Đông Á”) rồi nhập vào biểu thức sau:
=RANK(C3;C$2:C$6;0)
Ý nghĩa của biểu thức trên là tính hạng của đội “Đông Á” dựa vào điểm. Lưu ý tham số thứ 2 miêu tả vùng dữ liệu làm cơ sở sắp hạng cho cell điểm C3, bạn nên miêu tả vùng này bằng địa chỉ tuyệt đối. Sau đó copy nội dung công thức vừa nhập và dán vào các cell còn lại ở cột hạng (tức các cell D3:D6). Kết quả hiển thị như hình sau:
 
Hỏi: Xin cho biết công thức để nối (merge) dữ liệu của 2 hay nhiều cell kế tiếp nhau trong MS Excel.




Đáp: Bạn không nói rõ ngữ nghĩa cụ thể của tác vụ “merge” dữ liệu nên chúng tôi chỉ có thể trả lời tổng quát. Tác vụ “merge” (trộn) trong môn “Cấu trúc dữ liệu” là trộn 2 danh sách nhiều phần tử có thứ tự thành 1 danh sách có thứ tự. Chúng tôi chưa thấy tài liệu nào dùng từ “merge” nhiều cell dữ liệu cả, có thể bạn muốn “sort” (sắp xếp) các cell liên tiếp theo thứ tự mong muốn nào đó hay bạn muốn nối kết nội dung dạng chuỗi của các cell thành một chuỗi lớn! Tùy theo yêu cầu cụ thể, bạn sẽ tìm và dùng thuật toán giải quyết cụ thể rồi hiện thực thuật toán đó bằng ngôn ngữ VBA để có thể tác động trên các cell của worksheet Excel.
 
Hỏi: Làm thế nào để thêm một số lệnh thường dùng vào nút phải chuột trong Excel?



Đáp: Excel (hay các ứng dụng khác trong bộ Microsoft Office) quản lý nhiều menu khác nhau, mỗi menu được nhận dạng thông qua tên riêng. Thí dụ menu pop-up được hiển thị mỗi khi bạn ấn phải chuột trên 1 cell bảng tính có tên là menu "Cell". Microsoft cho phép người dùng được toàn quyền truy xuất, hiệu chỉnh nội dung của từng menu. Thí dụ macro VBA sau đây cho phép bạn thêm 1 lệnh (control) mới vào menu pop-up "Cell":

Sub AddMenuItem()
'định nghĩa biến tham khảo đến menu.
Dim objCommandBar As Office.CommandBar
'định nghĩa biến tham khảo đến control option.
Dim objCommandBarButton As Office.CommandBarButton
'Xác định menu "Cell"
Set objCommandBar = Application.CommandBars.Item("Cell")
'thêm 1 option (lệnh) mới vào menu "Cell"
Set objCommandBarButton = objCommandBar.Controls.Add(msoControlButton)
'thiết lập các thuộc tính cho option mới
With objCommandBarButton
.Caption = "Chuc nang 1"
.FaceId = 43
.Style = msoButtonIconAndCaption
.OnAction = "OnChucNang1"
End With
End Sub
'thủ tục xử lý option mới
Sub OnChucNang1()
'thí dụ thông báo cho người dùng biết
MsgBox "Bạn mới ấn chức năng 1"
End Sub
 
Hỏi: Xin hỏi toà soạn: Tôi sử dụng bảng tính Excell, sau khi làm xong tôi vào Tool\protection\protect Sheet và đã bảo vệ bảng tính này bằng mật khẩu. Khi mở lại, tôi quên mật khẩu, nhờ toà soạn chỉ giúp tôi có cách nào tìm lại mật khẩu này không? Xin chân thành cám ơn



Đáp:

Có thể tìm lại được mật khẩu nhưng bạn phải mua phần mềm. Bạn tham khảo các website

http://www.crackpassword.com/products/prs/msoffice/

http://www.elcomsoft.com/aopr.html
 
Hỏi:

Tôi có 1 bảng tính gồm 3 cột và 24 hàng. Tôi muốn viết chương trình tự động nhập vào mỗi ô 1 số ngẫu nhiên từ 1 tới 9999. Yêu cầu là không có số ngẫu nhiên nào trùng nhau.



Đáp:

Bạn có thể dùng hàm Randomize() và hàm Rnd() để tạo số ngẫu nhiên để đặt vào các cell của ma trận. Để tránh dùng lại số ngẫu nhiên cũ, bạn phải kiểm tra trước xem nó có trùng với những giá trị đã dùng chưa. Cụ thể macro sau sẽ thực hiện được yêu cầu của bạn:

Sub CreateRandom()
Dim RandList(0 To 3000) As Integer
Dim count As Integer
Dim num As Integer
count = 0
Khởi động số ngẫu nhiên
Randomize
Duyệt từng cell trong vùng chọn và tạo số tự động
For Each c In Selection
FindRand:
lấy 1 số ngẫu nhiên từ 1 tới 9999
num = Int(Rnd * 9998 + 1)
kiểm tra đã dùng số này chưa
For i = 0 To count
If num = RandList(i)
Then GoTo FindRand
Next
nếu chưa dùng thì thiết lập cho cell hiện hành
c.Value = num
lưu vào danh sách để kiểm tra
RandList(count) = num
count = count + 1
Next
End Sub
Lưu ý để dùng macro trên, bạn phải đánh dấu chọn vùng chứa các cell trên worksheet cần nhập số ngẫu nhiên rồi chạy macro.
 
Hỏi: Trong Microsoft Excel, lúc đầu em gõ thì các từ đều theo chiều ngang, nhưng bây giờ chúng lại thành chiều dọc. Em mong sự giúp đỡ của tạp chí. Em xin cảm ơn!



Đáp:
Trong MS Excel, bạn chọn một hoặc nhiều "cell" cần thay đổi (hoặc chọn tất cả "cell", tùy theo yêu cầu), nhấn Format.Cells....Alignment, thay đổi mục Orientation từ 90 độ về 0 độ.
 
Hỏi: Trong Excel, vào Menu View / Toolbars / Forms thì chỉ có một số Object có thể tạo được như label, listbox, checkbox, option button..., còn một số Object khác không thể tạo được (mờ) như combobox, textbox....



Đáp: Microsoft muốn nâng cấp bảng tính Excel thành Form giao diện của chương trình thay vì chỉ là 1 bảng dữ liệu. Tuy nhiên có thể hiện tại, Microsoft chưa hiện thực đầy đủ nên chỉ cho phép bạn tạo một số điều khiển như label, listbox, checkbox, option button... vào bảng tính, còn các điều khiển khác như textbox... thì sẽ hiện thực trong các version sau này. Tóm lại nếu bạn muốn tạo Form giao diện bất kỳ, bạn nên vào menu Tools.Macros.Visual Basic Editor để tạo User Form rồi thiết kế theo yêu cầu của mình y như bạn đã từng làm trên VB, VC++, Access...
 
Hỏi: Theo hướng dẫn của TGVT về cách dùng hàm đổi số sang chữ, tôi đã áp dụng được trong Excel (gõ =usd(address of cell of number)) nhưng trong Word thì không biết phải gõ hàm như thế nào. Đề nghị hướng dẫn.



Đáp: Có 2 hoạt động liên quan đến 1 hàm “user-defined”: xây dựng nó và dùng nó. Bạn có thể xây dựng hàm “user-defined” bằng macro (viết bằng ngôn ngữ VBA) hay bằng công nghệ COM Add-Ins (có thể viết bằng nhiều ngôn ngữ khác nhau như VB, VC++...). Về việc sử dụng hàm “user-defined”, có thể dùng (gọi) nó ở bất kỳ vị trí nào mà ở đó bạn gọi được hàm định sẵn. Thí dụ có thể gọi hàm “user-defined” trong các macro, các hàm xử lý sự kiện của các “User Form” hay các công thức được chèn trực tiếp vào tài liệu Word. Để chèn 1 công thức vào tài liệu Word, bạn đưa con trỏ về vị trí cần chèn, chọn menu Insert.Field, rồi nhập công thức mong muốn. Tuy nhiên, theo kết quả kiểm tra trên một số máy, chúng tôi nhận thấy các version Word từ trước tới nay chưa xử lý được hàm “user-defined” trong công thức nằm trong tài liệu Word. Đây là 1 hạn chế, hy vọng version tương lai sẽ khắc phục được.
 
Hỏi: Tôi có tập tin Excel quan trọng nhưng do cần dùng chung nên phải để trên mạng nội bộ. Vì không muốn người khác sửa hoặc xóa đi phần dữ liệu đã nhập, nên tôi sử dụng chức năng Protect workbook để bảo vệ, nhưng khi đó chức năng Auto filter lại không thể sử dụng được. Mong được hướng dẫn.



Đáp: Có 2 mức độ bảo vệ dữ liệu cho 1 file:

1. bảo vệ ở mức ứng dụng, thí dụ như bạn dùng chức năng bảo vệ của các chương trình trong bộ Office để bảo vệ dữ liệu của chúng. Mức độ bảo vệ này có nhiều khuyết điểm:

- rất khó quản lý vì bạn cần rất nhiều password khác nhau cho các file dữ liệu khác nhau, hay cho từng thành phần trong cùng 1 file.

- không đủ mạnh vì người biết định dạng file có thể viết ứng dụng riêng truy xuất trực tiếp dữ liệu của file đó mà không cần dùng ứng dụng đã tạo ra nó.

- có nguy cơ làm một số chức năng của ứng dụng không hoạt động tốt, thí dụ chức năng Auto Filter mà bạn nói...

2. bảo vệ ở mức hệ thống, các HĐH hiện nay đều có cơ chế này như WinXP, Linux. Ở mức độ này, mỗi người dùng sẽ có một account riêng với một số thẩm quyền nhất định về 1 số tài nguyên nhất định trên máy. Trước khi truy xuất các tài nguyên này, bạn phải khai báo account của mình (username và password). Mức độ bảo vệ này thường được thực hiện khá chặt chẽ, người dùng rất khó “len lỏi” qua được.

Tóm lại, bạn nên dùng mức độ bảo vệ hệ thống cho các tập tin Excel để đảm bảo an toàn, tin cậy hơn và giúp chức năng Auto Filter cũng như các chức năng khác của ứng dụng không bị lỗi. Ở mức độ này, bạn sẽ khai báo mỗi người dùng 1 account, mỗi account có thẩm quyền nhất định (theo yêu cầu của bạn) về các file Excel cũng như các tài nguyên khác của hệ thống.
 
Hỏi: Trong Excel có hàm nào cho phép xóa chuỗi kí tự như sau: ví dụ xóa hết các kí tự phía sau hay phía trước chữ m trong chuỗi “XXXXXmYYYYY”, các kí tự trước và sau chữ m thay đổi (không cố định).


Đáp:
Việc xóa hết các ký tự đi trước và sau chữ m trong 1 chuỗi nào đó tương đương với việc thay thế chuỗi đó bằng chữ m. Vậy nếu muốn thực hiện trên 1 cell duy nhất, cách tốt nhất là nhập lại chữ m cho cell đó. Còn nếu muốn thực hiện trên nhiều cell (trong 1 vùng được chọn), bạn có thể viết 1 macro để thực hiện điều này theo giải thuật lặp trên từng cell trong vùng chọn đó.
 
Hỏi: Trong Excel, dùng công thức nào để tính chuyến xe khi biết rằng: nếu giờ khởi hành từ 7g đến 9 g thì ghi “Chuyến 1”, từ 9g01 đến 12g thì ghi “Chuyến 2”, ngoài ra ghi “Chuyến 3”.



Đáp: Vì yêu cầu của bạn không phổ biến nên Excel không cung cấp hàm nào để giải quyết trực tiếp yêu cầu, tuy nhiên bạn có thể viết 1 hàm “user-defined” (bằng macro hay bằng ngôn ngữ lập trình chính quy) để giải quyết yêu cầu riêng tư của mình. Đoạn code sau đây miêu tả hàm TinhChuyen() viết bằng macro VBA để giải quyết yêu cầu của bạn. Lưu ý rằng kiểu Date của VB chẳng qua là kiểu thực (Double), mỗi giá trị Date là 1 số thực gồm 2 phần: phần nguyên miêu tả số lượng ngày giữa ngày tương ứng và ngày gốc 30/12/1899, phần lẻ miêu tả tỉ lệ phần trăm của thời điểm tương ứng so với thời điểm 0g00”:
tham số rng miêu tả cell chứa giờ cần tính chuyến

Function TinhChuyen(rng As Range) As String

Dim tb1 As Double

Dim tk1 As Double

Dim tk2 As Double

thiết lập giờ bắt đầu chuyến 1

tb1 = CDbl(#7:30:00 AM#)

thiết lập giờ kết thúc chuyến 1

tk1 = CDbl(#9:00:00 AM#)

thiết lập giờ kết thúc chuyến 2

tk2 = CDbl(#12:00:00 PM#)

Dim time As Double

tìm thời điểm cần xác định chuyến

time = rng.Item(1, 1).Value

kiểm tra xem có nằm trong chuyến 1 ?

If (tb1 <= time) And (time <= tk1) Then

TinhChuyen = “Chuyen 1”

kiểm tra xem có nằm trong chuyến 2 ?

ElseIf (tk1 < time) And (time <= tk2) Then

TinhChuyen = “Chuyen 2”

Else

trường hợp còn lại là chuyến 3

TinhChuyen = “Chuyen 3”

End If

End Function
 
Hỏi: Tôi muốn theo dõi kết quả học tập bằng bảng tính với các cột: môn, điểm miệng, 15, 1 tiết và thi. Có một vấn đề là làm sao để tính trung bình các số đã nhập trong cùng một ô. Xin hướng dẫn hoặc đề xuất thành lập bảng tính theo cách khác để tiện lợi hơn. Cách tính trung bình như sau: TB miệng + TB 15 + TB1 tiết*2 sau đó chia trung bình, lấy trung bình đó nhân 2 + điểm thi chia 3 ra trung bình học kì.



Đáp:

Có 2 vấn đề chính trong việc xây dựng bảng tính theo dõi điểm học tập các môn mà bạn yêu cầu:

1. Tạo cột điểm TB học kỳ của từng môn học, bạn chỉ cần nhập công thức tính theo các cột điểm khác, thí dụ, nếu cột A là tên môn, cột B là TB miệng, cột C là TB 15, cột D là TB tiết, cột E là điểm thi, cột F là điểm TB môn học thì bạn hãy nhập công thức cho cột F như sau:
=((B1+C1+D1*2)/4+E1)/3

Sau khi nhập và kiểm tra công thức cho môn học đầu tiên (thí dụ ở đây là hàng 1), bạn hãy copy công thức này rồi dán vào các hàng còn lại cho các môn học khác.

2. Theo yêu cầu của bạn, từng ô điểm của các cột B, C, D, E lại là giá trị trung bình của nhiều điểm trong suốt học kỳ. Về nguyên tắc, các cell này không thể chứa giá trị nhập vào mà phải là công thức tính trị TB của các giá trị nhập vào. Để dễ kiểm tra và giám sát các trị nhập vào, bạn có thể qui định một số cột trên cùng hàng của môn học sẽ chứa các điểm miệng, điểm 15, điểm 1 tiết, điểm thi riêng lẻ (thí dụ bạn dành 10 cột từ H đến Q để nhập điểm miệng, 10 cột kế từ R đến AA để nhập điểm 15...). Lúc này, cell B1 sẽ là công thức tính TB của 10 giá trị điểm miệng riêng lẻ từ H1:Q1 (=sum(H1:Q1)/10). Tuy nhiên cách giải quyết này cứng nhắc và không đáp ứng được yêu cầu vì bạn muốn nhập từ từ các điểm kiểm tra, mỗi lần có 1 điểm mới thì điểm TB phải được tính lại ngay lập tức. Để giải quyết vấn đề này, bạn cần viết 1 hàm “user-defined” đặc biệt, nhiệm vụ của nó là dò từng cell trong 1 dãy các cell qui định và chỉ tính TB của các cell có giá trị. Qui trình điển hình để tạo 1 hàm “user-defined” trong Excel như sau: chọn menu Tools.Macro.Visual Basic Editor để hiển thị cửa sổ VBE, chọn menu Insert.Module để tạo mới module code với tên mặc định là “Module1” rồi viết hàm DiemTB như sau:

Function DiemTB(rng As Range) As Double

Dim sum As Double

Dim count As Integer

sum = 0

count = 0

Duyệt từng cell trong Range

For Each c In rng

kiểm tra cell có dữ liệu không

If Len(c.Text) <> 0 Then

sum = sum + c.Value

count = count + 1

End If

Next

Tính TB nếu cần

if count <> 0 then

DiemTB = sum / count

endif

End Function

Sau khi đã tạo hàm user-defined như trên, bạn nhập công thức tính TB cho cell B1 (TB miệng) như sau: =DiemTB(H1:Q1). Các cell điểm khác trong bảng tính cũng được viết tương tự như cell B1.
 
Hỏi: Bảng tính Excel chứa các hàng có nội dung nằm xen kẽ với các hàng trống một cách ngẫu nhiên, tôi muốn chỉ in ra giấy các hàng có nội dung nằm sát nhau (còn các hàng trống xen kẽ thì bỏ). Xin hướng dẫn.



Đáp:

Không có lệnh định sẵn nào của Excel giải quyết được yêu cầu đặc biệt của bạn. Do đó nếu muốn, bạn phải tự làm thủ công bằng tay hoặc viết 1 macro giải quyết yêu cầu riêng. Một trong nhiều cách viết macro khá đơn giản là dùng menu Tool.Macro.Record New Macro để ghi nhận lại trình tự các thao tác mà bạn thực hiện thủ công lần đầu, để những lần sau bạn chỉ cần kích hoạt macro, nó sẽ tự thực hiện lại đúng trình tự thao tác mà bạn đã làm y như lần đầu.
 
Hỏi: Xin hướng dẫn đoạn code VBA Việt hóa các menu và hộp thoại trong Word 2002 và Excel 2002.



Đáp: Đoạn code VBA sau cho phép xóa option “Save” trong menu “File” của Excel rồi add lại option
“Luu file”:

Public Function MenuEdit()

Dim myCmd As Object

With CommandBars(“Worksheet menu bar”).Controls(“File”)

.Controls(“Save”).Delete

.Controls.Add(Type:=msoControlButton, Before:=1).Caption = “Luu file”

.Controls(“Luu file”).OnAction = “FileSave”

End With

các đoạn code khác để bớt/thêm menu/option mong muốn

End Function

Sub FileSave()

MsgBox “Ban vua chon option Luu file”

End Sub

Bạn có thể phát triển đoạn code trên để Việt hóa toàn bộ hệ thống menu cho trình Excel hay thêm mới menu nếu cần thiết.
 
Hỏi: Tôi đã nhập thử đoạn code của hàm doiso được trình bày trong số báo tháng 8/2001 và chạy thử nó, tôi có 1 số thắc mắc sau:
- Chương trình này khi nhập số 0 thì không cho kết quả, nếu không nhập gì thì lại cho kết quả là "không".
- Làm thế nào để cài đặt cố định hàm doiso này vào Excel, Word để dùng cho mọi trường hợp mà không phải mở file có hàm doiso này.
- Điều mà tôi rất cần đó là làm thế nào để hàm doiso này ứng dụng được trong Word.



Đáp: Trước hết, chúng tôi xin lỗi do sơ xuất trong nhập liệu nên mã nguồn của hàm doiso bằng ngôn ngữ VB trong số báo T8/2001 (t.92) bị thiếu 1 lệnh. Bạn hãy thêm dòng lệnh "End If" vào trước lệnh "If chuc < 0 then Exit Do" (ở hàng thứ 4 từ dưới đếm lên của cột 2). Ngoài ra, khi nhập source code của hàm doiso, bạn phải xuống hàng trước khi viết lệnh sau mệnh đề Then của các lệnh If.

- Đúng như bạn nói, hàm doiso trong số báo T8/2001 chưa xử lý tốt các lỗi trong thông số nhập, nên nếu bạn truyền chuỗi "0" thì nó trả về chuỗi NULL và nếu bạn truyền chuỗi không miêu tả số nguyên hợp lệ, nó sẽ hoạt động sai và trả về kết quả không tiên đoán trước. Để khắc phục lỗi này, bạn nên dùng tham số kiểu Long thay vì kiểu String, thí dụ bạn nên hiệu chỉnh lại hàm doiso như sau :

Function doiso(ByVal val As Long) As String

Dim s As String

s = CStr(val)

'phần còn lại y như cũ

- Để có thể dùng hàm doiso trong các file Excel, bạn viết nó trong 1 module add-ins (thường có phần nới rộng *.xla) rồi "add" file add-ins vào Excel (bằng menu Tools.Add-ins). Tương tự để có thể dùng hàm doiso trong các file Word, bạn viết nó trong 1 module add-ins (thường có phần nới rộng *.dot) rồi "add" file add-ins vào Word (bằng menu Tools.Template and Add-ins).
- Để tránh phải viết 2 module add-ins khác nhau cho 2 ứng dụng Excel và Word, bạn có thể viết hàm doiso trong module COM-Addins, lúc này cả Excel và Word đều có thể dùng chung file COM-Addins này. Qui trình chi tiết để viết 1 module Com-Addins được trình bày trong CD MSDN của Microsoft.
 
Hỏi: Xin hỏi cách truyền tham số và xử lý hàm do người dùng tự định nghĩa trong MS Excel. Ví dụ hàm Tichdecart(A1:A10), nếu định nghĩa hàm Tichdecart(Arg1 as long, Arg2 as long.... Arg10 as long) thì bất tiện và không linh hoạt (khó thay đổi số lượng phần tử).



Đáp:
Cách phổ biến nhất để tạo hàm do người dùng định nghĩa (user-defined function) trong Excel là viết hàm này bằng ngôn ngữ VBA. VBA là tập con của VB, nó cũng kiểm tra kiểu tham số như bao ngôn ngữ lập trình mạnh khác, trong đó mỗi hàm có thể có nhiều tham số, mỗi tham số có thể truyền theo trị hay tham khảo, mỗi tham số cũng có kiểu dữ liệu cụ thể. Kiểu của 1 tham số có thể là kiểu đơn giản như Bool, Integer, Long,... Kiểu tham số cũng có thể là kiểu đối tượng, thí dụ trong trường hợp bạn muốn truyền 1 tập hợp nhiều cell trong bản tính Excel, bạn có thể dùng kiểu "Range" để miêu tả tham số.

Thí dụ muốn tạo hàm MySum(Range) tính tổng các cell được miêu tả trong tham số, bạn có thể chạy Excel, tạo/mở file Excel của mình, chọn menu Tools.Macro.Visual Basic Editor để hiển thị cửa sổ VBE, chọn menu Insert.Module để tạo mới module code với tên mặc định là "Module1" rồi viết hàm MySum như sau:

' hàm MySum có tham số thuộc kiểu Range miêu tả 1 khối các cell

Public Function MySum(rng As Range) As Double

Dim sum As Double

sum = 0

' duyệt từng cell trong Range

For Each c In rng

sum = sum + c.Value

Next

MySum = sum

End Function

Tương tự, bạn có thể định nghĩa hàm TichDecard như sau:

' hàm TichDecard có tham số thuộc kiểu Range miêu tả 1 khối các cell

Public Function TichDecard(rng As Range) As Double

' thân của hàm TichDecard
...

End Function
 
Hỏi: Tôi thường làm việc với bảng tính Excel, để giảm bớt khối lượng tính toán, tôi dùng VBA để tạo một số file *.xla, tuy nhiên tôi gặp khó khăn trong việc đưa các file này vào ứng dụng thực tế:
1. Tôi copy tất cả những tập tin *.xla vào C:/Users\Tra^`n Ba' Tha`nh\applications data\office\add-ins và thực hiện việc "add" vào trong file Excel, nhưng khi những người cùng mạng (nội bộ) copy bảng tính của tôi (có thực hiện lệnh tôi đã tạo) vào trong máy họ thì máy báo không nhận được file *.xla, và phải thực hiện lại việc "add". Làm sao để người dùng trong mạng không phải "add" lại?
2. Dùng chương trình gì để tạo help cho các file *.xla?
3. Khi add các file *.xla vào Excel, trong hộp thoại add-ins hiện lên tên file. Tôi muốn trong hộp thoại hiện tên khác và những người khác không thể chỉnh sửa được khi không được phép, tôi phải làm thế nào?



Đáp: 1. Excel (cũng như các ứng dụng trong bộ Office) chỉ cung cấp một số hữu hạn và xác định các hàm chức năng phổ dụng. Tuy nhiên nó cho phép người dùng tạo thêm các hàm chức năng phục vụ nhu cầu cá nhân thông qua nhiều kỹ thuật khác nhau như: viết hàm bằng macro VBA, viết hàm bằng ngôn ngữ lập trình VC++ rồi dịch thành thành phần COM Add-ins. Nếu bạn đã viết hàm bằng macro VBA, bạn có thể nhúng hàm đó vào file Excel cần dùng ở nhiều cấp độ: macro add-ins (các file *.xla), "All open workbooks" (hàm toàn cục cho mọi bảng tính được mở bởi trình Excel trên máy bạn), "This workbook" (hàm chỉ được thấy cục bộ trong bảng tính chứa nó). Để giúp người dùng khác dễ dàng dùng file Excel có gọi hàm tự tạo, bạn nên viết thẳng các hàm tự tạo thành những macro nằm trong chính file Excel đó (dùng cấp độ nhúng "This workbook"). Điều này gây bất tiện cho người tạo macro, gây ra sự "nhân bản macro" trên nhiều file Excel cùng dùng macro đó, nhưng sẽ làm chúng "trong suốt" với người dùng. Trong trường hợp bạn viết các hàm tự tạo trong các file *.xla, người dùng Excel buộc phải "add" tường minh chúng vào ứng dụng Excel của họ (trong lần đầu tiên họ truy xuất file Excel có dùng hàm tự tạo). Nếu bạn muốn thực hiện tự động việc "add" các file add-ins vào Excel, bạn có thể viết 1 đoạn code VBA nhỏ trong thủ tục Auto_Open của mỗi file Excel có dùng hàm tự tạo, nhiệm vụ của đoạn code này là "add" tự động các file add-ins cần dùng. Thủ tục Auto_Open sẽ tự động chạy mỗi khi người dùng mở file Excel tương ứng. Cách viết macro này đơn giản và an toàn nhất là dùng menu Tools.Macro.Record New Macro và thao tác thủ công việc "add" các file add-ins để Excel chuyển thành các lệnh VBA tương ứng.

2. Bạn có thể dùng tiện ích "Windows Help WorkShop" để soạn file Help theo công nghệ cũ, công nghệ "Windows Help". Tiện ích này có sẵn trong bộ Visual Studio 2000 hay cũ hơn. Bạn cũng có thể dùng tiện ích "HTML Help WorkShop" để soạn file Help theo công nghệ mới, công nghệ "HTML Help". Tiện ích này có sẵn trong bộ Visual Studio .Net hay trên website của Microsoft. Để dùng 1 trong 2 tiện ích trên, bạn cài đặt nó vào máy, chạy và đọc phần Help online của nó, nói chung các ứng dụng của Microsoft có tính thân thiện và dễ dùng.

3. Mỗi file add-ins có nhiều thông tin, nếu nó chứa field "Title" thì khi cửa sổ "add-ins" hiển thị, hệ thống sẽ lấy chuỗi "title" để hiển thị trong danh sách thay vì là tên file add-ins. Trong trường hợp đã xây dựng rồi add-ins file và chỉ muốn hiệu chỉnh lại chuỗi hiển thị của add-ins, bạn có thể dùng Windows Explorer, duyệt tìm file add-ins, hiển thị cửa sổ Properties của file, chọn tab Summary, nhập tên gợi nhớ vào textbox "Title".

Nếu cần bảo vệ file add-ins không cho người khác xem và chỉnh sửa code, hãy chạy Excel, mở file *.xla, mở cửa sổ code của nó và chọn menu Tools.VBAProject Properties trong cửa sổ code "Visual Basic Editor", chọn tab Protection, đánh dấu chọn vào checkbox "Lock project for Viewing", nhập password vào rồi ấn OK. Lưu ý phải nhớ password cẩn thận để có thể hiệu chỉnh add-ins sau này (nên ghi vào sổ tay vì con người thường rất mau quên).
 
Hỏi: Xin hướng dẫn cách bảo mật file Excel để chỉ cho phép Save chứ không cho phép Save As và Copy. Trang web nào cung cấp những thông tin về macro trong Excel?



Đáp: Bạn có thể đọc các bài báo (dạng web) trong CD MSDN để biết chi tiết và cụ thể các thông tin về Excel. Ngoài ra bạn cũng có thể đọc phần trợ giúp của chương trình Excel hay vào Internet để tìm kiếm và đọc thêm những trang web nói về Excel. Nếu muốn an toàn và bảo mật thông tin cho các file, bạn nên dùng HĐH có khả năng này như WinXP, Linux... Tuy nhiên, hầu hết các HĐH không có chế độ bảo vệ quá "kỳ cục" như bạn yêu cầu: làm sao chỉ cho đọc file mà không cho Copy! làm sao cho Save mà không được Save As! Thí dụ Linux cung cấp 3 quyền sau cho từng file:

• Quyền "Read" cho phép người dùng đọc thông tin trên file vào bộ nhớ, như vậy họ có quyền xem, copy hay save as sang file khác.

• Quyền "Write" cho phép người dùng được hiệu chỉnh nội dung file, xóa file.

• Quyền "Excute" cho phép người dùng chạy (thực thi) file.

Như vậy cơ chế bảo vệ của Linux không thể đáp ứng yêu cầu cá nhân của bạn (dĩ nhiên các HĐH khác cũng tương tự).
 
Hỏi: Làm cách nào tìm ra nhanh nhất các số trùng nhau trong 1 hoặc nhiều cột Excel đồng thời chỉ ra các số đó nằm ở hàng nào?



Đáp: Excel (hay 1 ứng dụng khác trong bộ Microsoft Office) chỉ cung cấp một số chức năng hữu hạn và phổ dụng. Đối với những yêu cầu đặc thù thì Excel chỉ hỗ trợ người dùng giải quyết nó bằng cách cung cấp ngôn ngữ kịch bản (VBA) và cơ chế để người dùng tạo ra những module chương trình giải quyết đúng yêu cầu đặc thù của mình. Tóm lại để tìm ra các số trùng nhau trong 1 hay nhiều cột Excel, bạn có thể dùng VBA viết 1 macro (1 thủ tục VBA) duyệt tìm từng cell, so sánh chúng với nhau và hiển thị màu khác nhau cho từng nhóm cell có giá trị giống nhau.
 
Hỏi: Có phương thức nào trong VBA có thể lần lượt mở, copy 1 cell rồi đóng lại cho tất cả các file Excel có trong 1 thư mục được chỉ định không? Số file cần mở khoảng 2000 file, có tên dạng MA0001 - MA2000. Vị trí cell cần copy trong từng file là cố định (ví dụ là D7). Tôi đã dùng thử lệnh For nhưng thường thì chỉ có thể mở 500 file là bị báo thiếu bộ nhớ (RAM128MB). Có cách nào mở ra, đóng lại từng file để giải phóng bộ nhớ không?



Đáp: Bạn có thể viết 1 macro để thực hiện yêu cầu riêng, đoạn code sau đây sẽ lặp 2000 lần, mỗi lần mở 1 file, copy cell D7 của nó, đóng file đó lại rồi paste kết quả vào cell qui định ở worksheet hiện hành:
Sub CopyCell()
' CopyCell Macro
' khai báo các biến cần dùng
Dim Path As String
Dim Dir As String
Dim i As Integer
Dim rg As String
' thiết lập thư mục
Dir = "c:\data\"
' lặp 2000 lần
For i = 1 To 2000
' tạo pathname truy xuất file thứ i
Path = Dir & "ma" & Format(i, "0000") & ".xls"
' mở file
Workbooks.Open Filename:=Path
' chọn cell d7
Range("d7").Select
' copy nó vào clipboard
Selection.Copy
' đóng file
ActiveWorkbook.Close
' thiết lập cell cần dán kết quả
rg = "A" & i
Range(rg).Select
' dán kết quả
ActiveSheet.Paste
Next i
End Sub
Lưu ý rằng trong mỗi vòng lặp ta đều thực hiện đóng file sau khi đã truy xuất. Nếu đoạn chương trình trên bị dừng giữa chừng và báo lỗi thiếu bộ nhớ thì có thể kết luận rằng hoạt động đóng file của Excel có lỗi chứ không phải là đoạn code.
 
Hỏi: 1. Xin hỏi làm cách nào để đưa một hàm tự tạo vào thư viện hàm Excel.
2. Làm cách nào để xuất dữ liệu dạng text trong môi trường Acad14 sang dạng Text trong môi trường Excel.



Đáp: 1. Có nhiều cách để đưa 1 hàm tự tạo vào thư viện hàm của Excel, trong đó cách viết hàm dạng VBA, lưu hàm trong file add-ins rồi "add" file add-ins này vào môi trường Excel của bạn. Qui trình điển hình để viết và dùng hàm tự tạo bằng VBA như sau:

• Chạy Excel, tạo 1 Workbook mới, chọn menu Tools.Macro.Visual Basic Editor để mở cửa sổ viết macro cho Workbook hiện hành, ấn kép chuột vào phần tử gốc "VBAProject" trong cửa sổ Project, chọn mục Insert.Module để tạo 1 module phần mềm mới (tên mặc định là Module1), rồi viết code cho từng hàm tự tạo theo yêu cầu trong module mới này.

• Dịch project add-ins và debug nó bằng cách chọn menu Debug.Compile... trong cửa sổ soạn code "Visual Basic Editor".

• Nếu cần bảo vệ project add-ins không cho người khác xem và chỉnh sửa code, hãy chọn menu Tools.VBAProject Properties trong cửa sổ code "Visual Basic Editor", chọn tab Protection, đánh dấu chọn vào checkbox "Lock project for Viewing", nhập password vào rồi ấn OK. Lưu ý phải cẩn thận nhớ password để có thể hiệu chỉnh add-ins sau này (nên ghi vào sổ tay vì trí nhớ của con người thường rất ngắn hạn).

• Sau khi viết xong các hàm tự tạo, chọn menu File.Close and Return to Microsoft Excel để trở về cửa sổ Excel.

• Chọn menu File.Properties để hiển thị cửa sổ thuộc tính, chọn tab Summary, nhập chuỗi nhận dạng file add-ins, tức tên gợi nhớ của add-ins mà sẽ được hiển thị trong hộp thoại add-ins của người dùng.

• Dùng menu File.Save As để lưu add-ins lên file *.xla.

• Sau khi đã tạo ra file add-ins, bạn chọn menu Tools.Add-ins để hiển thị cửa sổ add-ins, chọn button Browse rồi duyệt file add-ins vừa tạo để "add" nó vào trong Excel.

Từ đây, mỗi khi bạn chạy Excel, file add-ins của bạn sẽ tự động được nạp vào Excel để bạn có thể gọi bất kỳ hàm nào đã được viết trong file add-ins đó.

2. Excel cho phép bạn "import" dữ liệu text từ bất kỳ ứng dụng khác miễn sao file dữ liệu text có định dạng qui định. Định dạng thường dùng là file text phải chứa n hàng dữ liệu, mỗi hàng dữ liệu gồm m thành phần dữ liệu được ngăn cách bởi dấu ngăn nào đó (thí dụ dấu phẩy, TAB...). Để "import" 1 file vào Excel, bạn chạy Excel, chọn menu File.Open như bình thường, duyệt và xác định file cần import, trả lời một số thông số của qui trình wizard...
 
Hỏi: Lập trình VBA trong Excel, tôi muốn khi gõ 1 ký số vào 1 cell (thí dụ là 1, 2 ...) thì số đó sẽ được hiển thị theo màu tương ứng. Đoạn code như sau:
Set Worksheets("Sheet1").Range("A1:A30") as pt
Private sub Worksheets_Activate ()
Select case pt
Case pt.value = 1
pt.font.color = RGB(0, 0, 255)
Case pt.value = 2
pt.font.color = RGB(0, 255, 255)
...
End Select
End sub
Chương trình không làm việc đúng, xin hỏi sai ở đâu?



Đáp: Để giải quyết yêu cầu của bạn, trước hết bạn phải định nghĩa 10 giá trị màu cho 10 ký số khác nhau, sau đó bạn viết thủ tục xử lý sự kiện xảy ra sau khi nhập liệu xong 1 cell, thủ tục xử lý sự kiện này không phải là Worksheet_Activate() như bạn viết, mà là Worksheet_Change(). Để viết thủ tục này, bạn hãy chọn menu Tools.macro.Visual Basic Editor. Trong cửa sổ VBAProject, ấn kép chuột vào tên Sheet cần xử lý (thí dụ Sheet1), chọn mục "Worksheet" trong listbox các đối tượng, chọn mục "Change" trong listbox các sự kiện kết hợp, VB sẽ tự tạo hàm xử lý sự kiện tương ứng. Bạn viết code vào thân thủ tục này như sau:

Private Sub Worksheet_Change(ByVal Target As Range)
Color0 = RGB(0, 0, 255)
Color1 = RGB(0, 255, 0)
Color2 = RGB(255, 0, 0)
Color3 = RGB(255, 0, 255)
Color4 = RGB(0, 255, 255)
Color5 = RGB(255, 255, 0)
Color6 = RGB(128, 128, 128)
Color7 = RGB(128, 0, 128)
Color8 = RGB(0, 128, 255)
Color9 = RGB(255, 128, 0)
Select Case Target.Value
Case 0: Target.Font.Color = Color0
Case 1: Target.Font.Color = Color1
Case 2: Target.Font.Color = Color2
Case 3: Target.Font.Color = Color3
Case 4: Target.Font.Color = Color4
Case 5: Target.Font.Color = Color5
Case 6: Target.Font.Color = Color6
Case 7: Target.Font.Color = Color7
Case 8: Target.Font.Color = Color8
Case 9: Target.Font.Color = Color9
End Select
End Sub

Sau khi đã viết xong thủ tục, bạn hãy quay về Worksheet Excel và thử nghiệm kết quả, mỗi lần bạn nhập các số từ 0 tới 9 vào 1 cell nào đó rồi enter thì ký số mới nhập vào cell đó sẽ được hiển thị theo màu qui định với giá trị của nó.
 
Hỏi: Trong Excel, thực hiện liên kết thông tin Sheet1 với Sheet2 (dùng Paste Link), khi xóa hay thêm bất kỳ thông tin gì trong "vùng copy" của Sheet1 thì thông tin trong Sheet2 cũng thay đổi theo. Nhưng nếu thêm 1 dòng hay 1 cột trong "vùng copy" của Sheet1 thì Sheet2 không thay đổi theo. Hỏi có cách nào để thay đổi Sheet2 tự động như đã trình bày không?



Đáp:

Không. Vì kích thước và vị trí của vùng link đã được xác định tĩnh tại thời điểm copy nên chỉ có những thay đổi về nội dung của bản gốc mới được cập nhật sang vùng link, còn các thay đổi về kích thước (số lượng hàng/cột) sẽ không tự động cập nhật sang vùng link. Nếu muốn, bạn phải cập nhật lại vùng link thủ công.
 
Hỏi: Xin hỏi có thể tạo Autotext trên Excel giống như Word không?



Đáp:

Do chức năng của Excel tập trung vào việc xử lý bảng tính nên nó không hỗ trợ nhiều chức năng biên tập tài liệu như Word. Thí dụ, Excel không hỗ trợ chức năng AutoText như Word. Do đó bạn cần kết hợp 2 ứng dụng Excel và Word để biên tập tài liệu chứa các bảng tính phức tạp và in ấn chúng.
 
Hỏi:

Trong Excel, kết quả của một field calculated (sau đây gọi là FC) có phần thập phân rất dài. Tôi muốn con số này được làm tròn theo nguyên tắc thông thường (phần đơn vị thêm 1 nếu phần thập phân >=0,5) rối lấy kết quả (đã có dạng số nguyên thật sự) để làm phần tính toán ở field khác. Tôi đã làm nhiều cách mà không được như ý, ví dụ "format" field đó thì chỉ được kết quả làm tròn về hình thức (không nhìn thấy phần thập phân) còn về mặt tính toán thì chương trình vẫn không gạt phần thập phân. Tôi đã phải làm kiểu "thủ công" như sau (sử dụng kết hợp function Iif và Fix)

Iif((FC-Fix(FC))<0,5,Fix(FC),Fix(FC)+1)

Xin hỏi có cách nào hay hơn?



Đáp: Đúng như bạn nói, việc "format" 1 field Excel chỉ ảnh hưởng đến hình thức hiển thị nội dung của cell đó chứ không biến đổi tường minh giá trị của cell đó. Như vậy, nếu muốn dùng giá trị sau khi làm tròn của cell nào đó và dùng trong công thức của cell khác, bạn phải viết tường minh biểu thức miêu tả yêu cầu của bạn. Hàm Iif mà bạn trình bày là 1 cách để làm tròn giá trị thực FC nhưng dài dòng và không trong sáng bằng cách dùng hàm Round(FC).
 
Hỏi: Tôi muốn viết đoạn code bằng VBA nhúng vào Excel (macro) để hiển thị hộp thoại trợ giúp (listbox) ngay tại cell đang chọn (giống chế độ hỗ trợ cú pháp trong môi trường lập trình VB, VC++). Tuy nhiên tôi không biết cách xác định vị trí của cell đang chọn.



Đáp:

Bạn có 2 cách chính để hiển thị listbox ngay tại cell đang được chọn:

1. Bạn để listbox vào một UserForm rồi hiển thị UserForm lên vị trí mong muốn.

2. Bạn "add" trực tiếp listbox vào Worksheet Excel tại vị trí mong muốn.

Tùy theo cách nào được dùng mà công thức tính vị trí (x,y) của đỉnh trên trái listbox sẽ hơi khác nhau. Sau đây là macro chứa đoạn code VBA hiển thị listbox theo cách 2:

'Macro add & hiển thị listbox trong Worksheet

Sub ListBoxDisp()

Dim x As Integer

Dim y As Integer

' Tính tọa độ x vị trí dưới phải của cell hiện hành

x = ActiveCell.Offset(1, 1).Left

' Tính tọa độ y vị trí dưới phải của cell hiện hành

y = ActiveCell.Offset(1, 1).Top

' Add 1 listbox vào Worksheet hiện hành tại vị trí x,y

Set Box = ActiveSheet.ListBoxes.Add(x, y, 100, 50)

' Thiết lập nội dung của listbox

Box.AddItem "Mục 1"

Box.AddItem "Mục 2"

Box.AddItem "Mục 3"

End Sub

Còn sau đây là macro chứa đoạn code VBA hiển thị listbox theo cách 1 (trong UserForm):

'Macro hiển thị UserForm chứa listbox lên trên Worksheet

Sub UserFormDisp()

Dim x As Integer

Dim y As Integer

' Tính tọa độ x vị trí dưới phải của cell hiện hành

x = ActiveCell.Offset(1, 1).Left

' Tính tọa độ y vị trí dưới phải của cell hiện hành

y = ActiveCell.Offset(1, 1).Top

' Đổi vị trí tương đối x,y thành vị trí tuyệt đối so với vị trí trên trái màn hình

...

UserForm1.StartUpPosition = 0

' Thiết lập nội dung của listbox

UserForm1.ListBox1.AddItem "Muc 1"

UserForm1.ListBox1.AddItem "Muc 2"

UserForm1.ListBox1.AddItem "Muc 3"

' Thiết lập lại vị trí và kích thước của UserForm

UserForm1.Move x, y, 100, 50

' Hiển thị UserForm

UserForm1.Show

End Sub

Lưu ý trong macro UserFormDisp, lúc đầu ta cũng tính tọa độ (x,y) của điểm dưới phải của cell hiện hành để làm đỉnh trên trái của UserForm, nhưng tọa độ này là tọa độ tương đối so với điểm trên trái của cell đầu tiên trong Worksheet (cell A1), khi người dùng cuộn dọc hay cuộn ngang bảng tính thì cell A1 của bảng tính có thể được hiển thị ở đâu đó trên màn hình (hay ở ngoài màn hình và không thể thấy được). Do đó ta cần phải chuyển đổi tọa độ (x,y) này về dạng tuyệt đối so với điểm trên trái vật lý của màn hình (0,0) trước khi dùng nó để định vị UserForm vì UserForm là đối tượng độc lập với bảng tính, tọa độ của nó là tọa độ tuyệt đối so với điểm trên trái của màn hình máy tính.
 
Hỏi:

Trong Excel, khi dùng các hàm address(), column(), Row() để lấy địa chỉ cell, làm sao để Excel hiểu đây là "địa chỉ cell" chứa dữ liệu tham chiếu trong công thức?

Ví du: tại cell C3 tôi cần công thức để lấy giá trị 900 của cell phía trên (tức cell C2), nếu nhập công thức sau:

=ADDRESS(ROW()-1,COLUMN())

thì nội dung hiển thị là chuỗi "$C$2" chứ không phải giá trị cần lấy là 900 như mong muốn.



Đáp: Bạn có thể dùng hàm "Indirect" để truy xuất nội dung của 1 cell bất kỳ nếu biết được địa chỉ dạng text của cell đó. Cụ thể trong thí dụ của bạn, trong cell C3 thay vì nhập công thức "=Address(row()-1,column())", bạn hãy nhập công thức "=Indirect(Address(row()-1,column()))", lúc này bạn sẽ thấy cell C3 hiển thị giá trị 900 (của cell C2) như mong muốn.
 
Hỏi: Trong MS Excel, làm sao để vẽ 1 đường thẳng trong header & footer như Microsoft Word? Tôi dùng SHIFT+/- để vẽ, trên màn hình thấy liên tục nhưng khi in ra lại bị ngắt khúc.



Đáp:

Excel không đủ mạnh như Word trong tác vụ chỉnh dạng hình thức. Để vẽ đường thẳng ngang trong header hay footer của trang Excel, bạn có thể dùng 1 trong các phương pháp sau:

1. Dùng 1 font chữ chứa 1 ký tự đặc biệt, ký tự này là lằn gạch ngang từ biên trái sang biên phải của ký tự, rồi soạn header hay footer bằng 1 chuỗi những ký tự gạch ngang này. Ý tưởng của phương pháp này rất giống cách mà bạn thực hiện nhưng đảm đảo footer hay header sẽ được in đúng (lằn gạch ngang liền nét tạo từ các ký tự gạch ngang liên tiếp nhau). Tuy nhiên ít có font chữ thông dụng nào có ký tự gạch ngang thỏa mãn yêu cầu của bạn, bạn cần dùng trình soạn font (như FontoGrapher) để tự vẽ ký tự này theo ý mình rồi dùng nó cho mục đích riêng.

2. Dùng chế độ chỉnh dạng gạch dưới cho header hay footer. Bạn chỉ cần nhập chuỗi ký tự trống (space) đủ lớn, sau đó thiết lập chế độ gạch dưới cho chuỗi ký tự trống này thì sẽ có ngay 1 lằn gạch ngang liền nét. Độ dài của lằn gạch ngang phụ thuộc vào số lượng ký tự trống và co chữ được dùng.

3. Nếu thấy 2 cách trên phiền hà quá, bạn có thể dùng Word để trang trí khung trang cần in gồm header và footer với nội dung và hình thức mong muốn rồi dán nội dung cần in trong trang từ Excel sang.
 
Hỏi: Bảng tính Excel có 2 cột: 1cột English, 1 cột Vietnamese. Làm sao để khi sắp xếp cột English theo thứ tự từ A đến Z thì cột Vietnamese cũng được sắp tự động theo A đến Z? Mỗi cột có comment, làm sao để cột này tự động lấy giá trị là comment của cột kia?



Đáp:

Máy tính cũng như các phần mềm máy tính (trong trường hợp của bạn là Excel) là những phần tử thừa hành, chúng không tự động thực hiện việc gì cả, muốn chúng làm giúp công việc gì, người dùng bắt buộc phải ra lệnh cho chúng một cách cụ thể và chi tiết.

Với ý tưởng như trên, Excel không thể sắp xếp tự động dùm bạn cột dữ liệu tiếng Việt khi bạn chỉ ra lệnh cho nó sắp xếp cột dữ liệu chứa tiếng Anh. Nếu việc sắp xếp xãy ra nhiều lần, bạn có thể ghi lại qui trình thao tác mà bạn thực hiện để sắp xếp 1 cột dữ liệu thành 1 macro, sau đó hiệu chỉnh lại macro đó để nó thực hiện nhiều lần trên những cột dữ liệu khác, nhờ đó khi cần sắp xếp lại các cột dữ liệu, bạn chỉ cần ra lệnh chạy macro tương ứng. Để hiệu chỉnh được macro, bạn cần biết ngôn ngữ VBA (Visual Basic for Application), ngôn ngữ được dùng để viết macro trong các ứng dụng Microsoft Office.

Tương tự muốn các cell của 1 cột nào đó nhận chuỗi chú thích (comment) của cell tương ứng ở cột khác, bạn buộc phải ra lệnh tường minh cho Excel thực hiện. Nếu thấy thao tác thủ công thực hiện công việc này là phiền hà, bạn có thể tự động hóa bằng cách viết 1 hàm VBA như sau: (từ Excel, chọn menu Tools.Macro.Visual Basic Editor)

Function Comment(src As Range)

' hàm đọc chuỗi chú thích của cell src

Comment = src.Comment.Text

End Function

Sau khi đã viết hàm này thì từ trong WorkSheet, nếu bạn muốn cell nào đó (td. cell B1) nhận chuỗi chú thích của cell nào đó (td. cell A1), bạn chỉ cần nhập công thức sau vào cell B1:

=Comment(A1)

Nếu muốn từng cell của cột B chứa chuỗi chú thích của cell tương ứng của cột A, bạn chỉ cần copy nội dung của cell B1 rồi 'paste' nó vào các cell còn lại trong cột B, Excel sẽ tự động hiệu chỉnh tham số của hàm Comment trong công thức thành A2, A3, ... vì tham số đó ở dạng tham khảo tương đối.
 
Hỏi: Xin chỉ cách để chuyển từ file Word sang file Excel với qui định phân tách cột nếu cách 2 khoảng trắng trở lên. Ví dụ: "Nguyễn Văn A 8644859 8 đường Lữ Gia, P15, Q11, TP.HCM" được chuyển thành 3 cột sau: Nguyễn Văn A 8644859 8 đường Lữ Gia, P15 Q11 TP.HCM



Đáp:

Excel có thể đọc được nhiều dạng file khác nhau, trong đó có dạng file text-only (văn bản thô). Khi bạn chọn menu File.Open để mở 1 file text-only thì Excel sẽ hiển thị tuần tự 3 cửa sổ yêu cầu bạn khai báo kiểu dữ liệu (bạn chọn checkbox 'Delimited'), dấu ngăn cách các field dữ liệu (bạn có thể chọn dấu tab, dấu phẩy, dấu chấm phẩy, khoảng trống hay nhập vào ký tự dấu ngăn nào bạn muốn). Nếu bạn khai báo dấu ngăn phù hợp với ký tự mà bạn dùng để ngăn cách các field dữ liệu trong file văn bản của mình thì Excel sẽ đọc và chứa vào các cột đúng theo ý muốn.

Tóm lại nếu bạn muốn chuyển dữ liệu từ Word sang Excel và muốn giữ đúng các cột dữ liệu, bạn hãy ngăn các cột dữ liệu bằng 1 ký tự đặc biệt nào đó sao cho không tranh chấp và nhầm lẫn với dữ liệu (ký tự tab là phù hợp nhất trong đại đa số trường hợp). Nếu đã lỡ dùng 2 khoảng trắng để ngăn cách các cột dữ liệu, bạn có thể thay thế chúng bằng ký tự dấu ngăn phù hợp hơn (bằng cách chọn menu Edit.Replace, nhập 2 khoảng trắng vào mục 'Find what' và ký tự dấu ngăn vào mục 'Replace with' rồi ấn button 'Replace All'). Lưu ý rằng nếu chọn dấu ngăn là ký tự điều khiển (thí dụ ký tự tab), bạn không nhập trực tiếp được ký tự điều khiển này mà phải chọn button More.Special.Tab Character. Sau khi đã chuẩn bị đúng format cần thiết cho Excel, bạn dùng chức năng File.Save As để lưu kết quả lên file (chọn kiểu file lưu là 'Plain text (*.txt)'. Sau đó chạy Excel, dùng menu File.Open để đọc file, lúc này Excel sẽ hiển thị tuần tự 3 cửa sổ yêu cầu bạn khai báo tính chất của file để nó xử lý đúng.

Trong trường hợp bạn muốn copy dữ liệu dạng nhiều cột từ Word rồi dán trực tiếp vào bảng tính Excel, bạn phải dùng dấu ngăn là tab vì Excel coi tab là dấu ngăn cách mặc định.
 
Hỏi: Hỏi: Xin hỏi làm cách nào để khai báo tiêu đề tùy ý cho add-ins *.xla trong Excel (bình thường trong hộp thoại add-ins hiển thị tiêu đề mặc định của file *.xla) và không cho phép người khác chỉnh sửa add-ins này?



Đáp:

Hiện có 2 công nghệ khác nhau để tạo 'add-ins' cho Excel (hay Word, PowerPoint...):
1. Công nghệ add-ins cũ dựa trên macro dùng ngôn ngữ kịch bản VBA (Visual Basic for Application). Với công nghệ này, 'add-ins' được lưu ở dạng source code (thường dưới dạng file *.xla), nó chỉ có thể chạy trên ứng dụng cụ thể (add-ins của Excel chỉ chạy với Excel, add-ins của Word chỉ chạy với Word...).
2. Công nghệ COM add-ins, đây là công nghệ mới, bạn có thể dùng bất kỳ ngôn ngữ lập trình nào hỗ trợ COM cũng được. Với công nghệ này, 'add-ins' được lưu ở dạng mã máy theo cấu trúc file *.dll, nó có thể chạy trên nhiều ứng dụng khác nhau.
Nếu bạn tạo file add-ins *.xla theo đúng qui trình và đã thiết lập thông số 'title' cho nó thì khi 'add' nó vào workbook Excel nào đó, bạn sẽ thấy nội dung title của add-ins chứ không phải tên file. Hãy kiểm tra lại qui trình xây dựng file *.xla của bạn với qui trình điển hình như sau:

o Chạy Excel, tạo 1 Workbook mới, viết code các hàm add-ins theo yêu cầu, tạo thêm toolbar hay menu bar cá nhân nếu muốn.
o Chọn menu File.Properties để hiển thị cửa sổ thuộc tính, chọn tab Summary, nhập chuỗi nhận dạng file add-ins, tức tên gợi nhớ của add-ins được hiển thị trong hộp thoại add-ins của người dùng.
o Dịch project add-ins và debug nó bằng cách chọn menu Debug.Compile... trong cửa sổ soạn code 'Visual Basic Editor'.
o Nếu cần bảo vệ project add-ins không cho người khác xem và chỉnh sửa code, hãy chọn menu Tools.VBAProject Properties trong cửa sổ code 'Visual Basic Editor', chọn tab Protection, đánh dấu chọn vào checkbox 'Lock project for Viewing', nhập password vào rồi ấn button OK. Lưu ý phải cẩn thận nhớ password để có thể hiệu chỉnh add-ins sau này (nên ghi vào sổ tay vì trí nhớ của con người thường rất ngắn hạn).
o Dùng menu File.Save As để lưu add-ins lên file *.xla.
Tương tự, nếu bạn xây dựng COM add-ins bằng tiện ích AddInDesigner theo đúng qui trình và đã thiết lập thông số 'AddIn Display Name' trong cửa sổ AddInDesigner thì khi người dùng sử dụng add-ins này, tên gợi nhớ của nó sẽ được hiển thị trong hộp thoại add-ins.
Trong trường hợp đã xây dựng add-ins rồi và chỉ muốn hiệu chỉnh lại tên hiển thị của add-ins, bạn có thể dùng Windows Explorer, duyệt tìm file add-ins, hiển thị cửa sổ Properties của file, chọn tab Summary, nhập tên gợi nhớ vào textbox 'Title'.
 
Hỏi: Hỏi: 1. Tôi gặp khó khăn trong việc đưa các file *.xla tự tạo vào ứng dụng thực tế: Tôi copy các tập tin *.xla vào thư mục ...\applications data\microsoft\add-ins, và thực hiện add vào trong Excel, nhưng khi dùng bảng tính có sử dụng công thức trong file .xla trên máy khác (trong cùng mạng) thì máy báo không nhận được file .xla, và lại phải thực hiện việc add. 2. Để tạo phần trợ giúp (help) cho file .xla thì dùng file dạng *.chm hay *.hlp? Dùng chương trình gì để tạo các file đó?



Đáp:

Đáp: 1. Những file add-ins là những file của người dùng định nghĩa và thêm vào môi trường Excel để dùng cho mục đích cá nhân, chúng không phải là những file chuẩn và tích hợp sẵn vào Excel để mọi người đều dùng được, do đó để Excel trên máy nào đó dùng được các thành phần trong file add-ins thì người dùng trên máy đó phải thực hiện thao tác "add" file add-ins vào Excel trước khi có thể dùng nó. Tuy nhiên nếu thấy việc thực hiện thủ công thao tác "add" các file add-ins vào Excel của 1 máy nào đó là phiền hà, tốn thời gian và có thể bị sai sót, bạn có thể viết 1 macro để thực hiện tự động thao tác này rồi dùng nó khi cần thiết. Bạn có thể tạo 1 file *.xls có đặc điểm là khi người dùng "open" nó thì macro sẽ chạy tự động bằng cách khai báo thủ tục xử lý sự kiện mở workbook của file *.xls như sau:

Private Sub Workbook_Open()

' gọi macro 'add' các file adds-ins vào Excel

Call MyMacro_Setup_Addins

End Sub

' macro 'add' các file add-ins vào Excel

Sub MyMacro_Setup_Addins

' các lệnh thưc hiện 'add' các file add-ins vào Excel

' có thể tạo ra các lệnh này bằng chức năng "Tools.Macro.Record New Macro"

...

End Sub

2. Hiện có 2 công nghệ xây dựng file trợ giúp (Help) do Microsoft hỗ trợ: Windows Help (file dạng *.hlp) và HTML Help (file dạng *.chm), trong đó HTML Help là công nghệ mà Microsoft đề nghị dùng vì nó mạnh, uyển chuyển hơn công nghệ cũ. File Help theo công nghệ HTML Help tương đương với 1 Website: nó là 1 tập gồm nhiều tài nguyên Web cấu thành. Để xây dựng file Help theo công nghệ này, bạn có thể dùng tiện ích "HTML Help Workshop", có thể tìm tiện ích này từ bộ Visual Studio .Net hay download trực tiếp từ website của Microsoft (http://www.msn.com). Việc sử dụng tiện ích khá dễ dàng, gồm các bước chính: tạo bảng mục lục theo dạng cây thứ bậc, viết từng trang Web miêu tả nội dung từng mục, liên kết từng mục trong bảng mục lục với trang web tương ứng, dịch ra file *.chm kết quả để sử dụng.
 
Hỏi: Hỏi: Làm thế nào để tạo được bảng tính Excel giống file "samples.xls" nằm ở thư mục "..\office\Examples\samples.xls"? 1. Từ ở sheet Contents sẽ tự động chuyển đến các sheet khác khi click chuột vào tên có trên đó? 2. Làm mất các số của row và chữ của column?



Đáp:

Đáp: 1. Trong Excel, mỗi cell ngoài việc có thể chứa dữ liệu nhập hay công thức, còn có thể chứa thêm 1 mối liên kết siêu văn bản (hyperlink) để giúp người dùng liên kết đến 1 cell khác trong worksheet nào đó của cùng workbook hay đến 1 file bất kỳ. Để tạo 1 hyperlink đến cell khác của cùng workbook, bạn chọn cell chứa hyperlink, chọn menu Insert.Hyperlink. Khi cửa sổ "Insert Hyperlink" hiển thị, bạn chọn mục "Place in this document" và khai báo địa chỉ của cell và tên worksheet mà bạn cần liên kết đến. Sau khi đã có hyperlink, bạn có thể nhấn kép chuột vào nó, Excel sẽ tự động chuyển đến vị trí liên kết của hyperlink. Thí dụ trong file samples.xls, cell B5 trong worksheet "Table of Contents" chứa 1 hyperlink với tiêu đề "Worksheet Functions", hyperlink này liên kết đến cell đầu tiên (cell A1) của worksheet "Worksheet Functions", nhờ vậy khi bạn nhấn chuột vào cell B5 thì worksheet "Worksheet Functions" sẽ được hiển thị để bạn thấy cell A1 của nó.

2. Để giấu các hàng và cột tiêu đề (hiển thị địa chỉ của hàng và cột) của 1 worksheet nào đó, bạn chỉ cần chọn menu Tools.Options.View rồi bỏ checkbox "Row & Column Headers" trong nhóm "Windows options".
 
Hỏi: Có 5 học sinh A, B, C, D, E với số điểm tuần tự là 9, 8, 8, 7, 6. Nếu dùng hàm Rank xếp hạng thì có kết quả như sau: A hạng 1, B hạng 2, C hạng 2, D hạng 4 và E hạng 5 (không có hạng 3 vì 2 học sinh đồng hạng nhì). Để có kết quả: A hạng 1, B hạng 2, C hạng 2, D hạng 3 và E hạng 4 thì phải làm sao?



Đáp:

Đáp: Bạn đã biết cách dùng cũng như chức năng cụ thể của hàm Rank(), tuy nhiên hàm này sắp hạng theo qui ước là nếu có nhiều phần tử cùng hạng i, thì hạng kế tiếp không phải là i+1 mà là i+n (n là số phần tử cùng hạng i). Nếu muốn kết quả sắp hạng theo cách khác (như bạn trình bày là các hạng phải liên tục nhau bất chấp có nhiều thành phần có cùng thứ hạng), bạn có thể viết 1 hàm VBA chuyên dụng cho mình (thí dụ tên là MyRank) với danh sách đối số giống như hàm Rank() có sẵn nhưng dùng giải thuật sắp hạng theo ý bạn. Tùy việc lưu trữ hàm MyRank() vào vị trí nào (file Excel hiện hành, All templates & document...), bạn có thể dùng nó chỉ trong file Excel hiện hành hay tất cả các file Excel trên máy bạn.
 
Hỏi: Hỏi: Trong một hoặc nhiều cột Excel, làm cách nào để tìm ra nhanh nhất các số trùng nhau?



Đáp: Đáp: Yêu cầu của bạn khá đặc biệt, Excel chưa cung cấp lệnh nào để thực hiện trực tiếp yêu cầu này. Tuy nhiên nếu bạn biết lập trình bằng ngôn ngữ VBA và biết cấu trúc dữ liệu hướng đối tượng của Worksheet Excel thì bạn có thể viết 1 macro (1 thủ tục VBA) thực hiện yêu cầu của mình. Bạn có thể dùng giải thuật tuần tự để tìm kiếm các cell có cùng 1 nội dung nào đó.
 
Hỏi: Hỏi: Tôi sử dụng hàm chuyển từ số sang chữ trong Excel theo hướng dẫn của PC World VN số 7/1999. Tuy nhiên hàm này chỉ dịch được các số không vượt quá 2.147.483.647, với các số lớn hơn, hàm trả về thông báo "#Value !".



Đáp:

Đáp: Đúng như bạn trình bày, hàm Writing (được viết bằng VBA) được đăng ở trang 90 số tháng 7/1999 PC World VN, mặc dù được viết theo giải thuật tổng quát nhưng chỉ có thể đổi các số không vượt quá giá trị 2.147.483.647. Lý do là hàm VBA này sử dụng 2 toán tử Mod và '\', đặc tính của 2 toán tử này là cố gắng đổi 2 toán hạng của mình về kiểu Long rồi mới lấy phần dư hay chia nguyên, do đó nếu 1 trong 2 toán hạng lớn hơn giá trị lớn nhất của số Long (2.147.483.647) thì nó không thể tính toán được.

Để khắc phục nhược điểm trên, bạn cần phải tìm 2 dòng lệnh sau trong hàm gốc:

temp = num Mod 1000

num = num \ 1000

rồi hiệu chỉnh chúng thành 2 lệnh tương đương sau (không dùng toán tử Mod và '\'):

temp = num - Fix(num / 1000) * 1000 ₡ num Mod 1000

num = Fix(num / 1000) ₡ num \ 1000
 
Hỏi: Hỏi: Excel có chức năng nào tương tự như Section của Word để chia văn bản ra thành những phần có thể định dạng riêng, ví dụ như header riêng không?



Đáp:

Đáp: Vì Excel là ứng dụng chuyên về xử lý bảng tính nên không đủ mạnh trong vấn đề dàn trang như Word. Thí dụ, Excel không cung cấp khả năng chia 1 worksheet ra thành nhiều Section có header và footer riêng như bạn muốn, do đó nếu muốn in dữ liệu trong Worksheet Excel ra nhiều trang với header và footer khác nhau thì bạn có thể dùng 1 trong các phương pháp phổ biến sau:

o Chọn in từng phần dữ liệu có header và footer riêng, hiệu chỉnh lại nội dung và hình thức trước khi in qua menu File.Page Setup.Header/Footer. Nếu cần thực hiện việc in ấn nhiều lần tại những thời điểm khác nhau, bạn có thể ghi lại trình tự điều khiển in trong lần đầu thành 1 macro để dùng dễ dàng cho những lần sau.

o Soạn thảo file Word phục vụ việc chỉnh dạng và in ấn, chia file Word ra nhiều section khác nhau để có header và footer độc lập nhau, vào Excel, chọn copy từng vùng dữ liệu Excel rồi sang Word, dùng menu Edit.Paste special, chọn checkbox "Paste Link" rồi chọn mục "HTML Format" để nhúng đối tượng Excel vào vị trí mong muốn trong file Word. Khi cần in dữ liệu, bạn chỉ in file Word. Khi cần hiệu chỉnh dữ liệu, bạn chỉ cần hiệu chỉnh file Excel, thông tin hiệu chỉnh sẽ được cập nhật tự động sang file Word.
 
Hỏi: Trong Excel, làm sao chỉnh độ rộng của cột, hàng ở mỗi trang khác nhau?



Đáp:

Không biết khái niệm “trang Excel” của bạn là gì. Lưu ý rằng mỗi file Excel có thể chứa nhiều worksheet, mỗi worksheet là 1 bản tính chứa tối đa 65536 hàng, mỗi hàng tối đa 256 cột. Trong mỗi worksheet, mỗi cột hay mỗi hàng có độ rộng thay đổi được theo yêu cầu người dùng, tuy nhiên bạn không thể chia 1 hàng hay 1 cột ra nhiều phân đoạn rồi thiết lập độ rộng riêng biệt cho từng phân đoạn đó.
 
Hỏi: Trong Excel, làm thế nào để cộng giá trị trong ô hiện thời với 1 ô khác và ghi lại vào ô đó. Ví dụ : E3 = E3 + E4.



Đáp:

Yêu cầu của bạn có thể giải quyết bằng macro. Bạn hãy viết macro đơn giản sau:

Sub MySum()

‘ macro cộng giá trị cell đang chọn với cell E4

‘ rồi cất kết quả vào cell đang chọn.

ActiveCell.Value = ActiveCell.Value + Range(“E4”)

End Sub
Rồi gán 1 trình tự phím tắt hay 1 icon trong toolbar cho macro này để tiện dụng. Mỗi lần cần thực hiện phép tính trên, bạn chỉ cần ấn trình tự phím tắt hay icon lệnh tương ứng.
 
Hỏi: Trong một số báo trước có bài viết về việc copy liên kết bảng tính MS Excel sang MS Word, tôi đã thử làm nhưng khi thay đổi nội dung trong file Excel thì nội dung của bảng tính trong Word lại không thay đổi. Vậy mong quý báo vui lòng cho biết nguyên nhân.



Đáp:

Thao tác copy 1 bảng Excel và dán mối liên kết của nó vào Word là rất dễ dàng, bạn chỉ cần thực hành một vài lần là thuần thục. Qui trình như sau:

- Chạy Excel, dùng chuột chọn vùng dữ liệu của bảng tính cần copy rồi thực hiện copy vào clipboard bằng cách nhấn chuột vào nút ‘Copy’ trên toolbar (hay nhấn phím tắt Ctrl-C).

- Chạy Word, đưa cursor về vị trí cần dán, nhấn chuột để xác định vị trí cần dán.

- Vào menu Edit.Paste Special, chọn checkbox “Past Link”, chọn mục “Microsoft Excel Worksheet Object”, bỏ checkbox “Float over text” rồi nhấn nút OK để dán mối liên kết vào vị trí. Từ đây mỗi khi bạn thay đổi thông tin trong vùng copy của bản tính Excel thì dữ liệu tương ứng trong Word cũng sẽ thay đổi theo. Tuy nhiên việc copy file Word này sang máy khác để tiếp tục làm việc sẽ gây nhiều phiền phức: bạn phải copy file Excel theo và để đúng vị trí thư mục như trong máy gốc.
 
Hỏi: 1. Khi khởi động Excel luôn hiện hộp thoại thông báo sau: The list and decimal separators specified by the system are identical. Substituting”:” for the list separator. phải ấn OK thì mới vào được Excel dùng bình thường? 2. Có cách nào để chỉnh cho dữ liệu liên kết dán từ Excel sang Word thẳng hàng với dòng văn bản trong Word không?



Đáp:

1. Sở dĩ Excel báo lỗi như bạn miêu tả là vì trong cửa sổ cấu hình của Control Panel.Regional Settings của Windows bạn đã dùng cùng ký tự để thiết lập cho “list seperator” và “decimal symbol”. Để Excel không báo lỗi nữa, bạn nên vào Control Panel.Regional Settings, chọn tab Number rồi quan sát và hiệu chỉnh ký tự của 2 field trên (tốt nhất là nên dùng dấu ‘.’ cho “decimal symbol” và dấu ‘,’ cho “list seperator”).

2. Khi bạn dán mối liên kết của một cell hay một vùng cell Excel vào một hàng văn bản của Word, Word sẽ dùng cạnh dưới của khung dữ liệu Excel để dóng hàng với đường “base line” của văn bản. Với cách thức dóng hàng này, ta cảm thấy văn bản trong các cell Excel hơi nhô cao so với văn bản Word trên cùng hàng. Để khắc phục lỗi này, bạn chọn các cell Excel trên hàng văn bản Word, rồi chọn menu Format.Font, chọn tab Character Spacing, chọn mục “Lowered” trong listbox “Position”, nhập số điểm cần hạ thấp văn bản trong cell (thí dụ 6pt).
 
Hỏi: Sau khi cài lại Excel, hàm đọc số ra chữ đã Add-in trước đây không còn dùng được, các ô chứa công thức (hàm) không đọc ra chữ nữa mà hiện thông báo “#NAME?”. Cách khắc phục?



Đáp:

Khi bạn cài lại Excel thì các thông số làm việc của Excel đã bị reset, danh sách các file Add-Ins mà bạn đã “add” vào Excel trước đây đã bị mất. Do đó sau khi cài đặt lại Excel, bạn mở file bảng tính của bạn, các cell nào có dùng các hàm nằm trong file Add-Ins của bạn sẽ không được Excel hiểu nữa và nó báo lỗi “#NAME?” như bạn trình này. Cách khắc phục là vào menu Tools.Add-Ins rồi “add” lại các file Add-Ins chứa các hàm cần dùng (như bạn đã làm trước đây).
 
Hỏi: Trong Excel, làm cách nào để sort dữ liệu trong bảng tính, đồng thời thứ tự dữ liệu trên một hàng phải đi theo dữ liệu cần sort đó?



Đáp:

Bạn có thể xem bảng tính Excel như là 1 database chứa nhiều record dữ liệu, các record được tổ chức theo hàng (mỗi hàng chứa 1 record) hay được tổ chức theo cột (mỗi cột chứa 1 record). Bạn có thể dùng menu Data.Sort để sắp xếp các record của database theo 1 số trường (field) dữ liệu của record. Để sắp xếp các record được chứa theo hàng, bạn hãy thực hiện các thao tác sau:

• Chọn các hàng chứa các record cần sắp xếp (dùng chuột nhấn vào hàng đầu, giữ chuột và kéo về hàng cuối trước khi thả chuột ra).

• Chọn menu Data.Sort, ấn button Options để vào cửa sổ “Sort Options” rồi chọn checkbox “Sort top to bottom”, quay lại cửa sổ “Sort” rồi khai báo từ 1 đến n cột dữ liệu làm tiêu chuẩn sắp xếp, mỗi tiêu chuẩn nên khai báo chính xác thứ tự sort tăng dần (ascending) hay giảm dần (descending).

• Cuối cùng nhấn button “OK” để bắt đầu sắp xếp.

Tương tự, để sắp xếp các record được chứa theo cột, bạn hãy thực hiện các thao tác sau :

• Chọn các cột chứa các record cần sắp xếp (dùng chuột ấn vào cột đầu, giữ chuột và kéo chuột về cột cuối trước khi thả chuột ra).

• Chọn menu Data.Sort, nhấn button Options để vào cửa sổ “Sort Options” rồi chọn checkbox “Sort left to right”, quay lại cửa sổ “Sort” rồi khai báo từ 1 đến n hàng dữ liệu làm tiêu chuẩn sắp xếp, mỗi tiêu chuẩn nên khai báo chính xác thứ tự sort tăng dần (ascending) hay giảm dần (descending).

• Cuối cùng nhấn button “OK” để bắt đầu sắp xếp.
 
Hỏi: Excel có thể biểu diễn số thập phân vô hạn tuần hoàn và phân số (dạng a/b) được không? Có thể đổi số thập phân vô hạn tuần hoàn ra phân số được không? Nếu được xin cho biết cách đổi.



Đáp:

Trong Excel, bạn chỉ có thể miêu tả phân số bằng cách nhập phân số đó vào 1 cell nào đó dưới dạng công thức “=a/b”. Tùy theo chế độ hiển thị mà cell đó được hiển thị như thế nào (kết quả gần đúng hay chính công thức đó). Tóm lại, bạn chỉ có thể miêu tả số thập phân vô hạn tuần hoàn trong Excel dưới dạng phân số tạo ra số đó và như vậy không cần chuyển đổi qua lại giữa 2 dạng này. Lưu ý là kết quả hiển thị lên màn hình chỉ là 1 số thực gần đúng chứ không phải dạng vô hạn tuần hoàn, tuy nhiên bạn đừng bận tâm với giá trị hiển thị vì nếu bạn dùng cell đó trong 1 công thức ở cell khác, Excel sẽ dùng phân số chứ không dùng giá trị được hiển thị.
 
Hỏi: Trong Excel, khi nhập các con số phần nguyên từ 32767 (nghĩa là 2^15) trở lên, với phần đuôi lẻ “,348” thì ở thanh formula phần số lẻ hiển thị không đúng. Đây là lỗi của Microsoft Excel? Làm thế nào để sửa lỗi này?



Đáp:

Trong Excel, khi bạn nhập 1 số thực (thí dụ 32768.348) thì formula bar có thể hiển thị giá trị hơi khác một chút (thí dụ là 32768.3479999999). Đây không phải là lỗi của Excel mà là vì Excel chứa số thực ở dạng không chính xác. Tuy nhiên độ sai lệch so với giá trị nhập vào là rất bé và thường chấp nhận được trong đại đa số trường hợp thông thường (chưa cần độ chính xác cao đặc biệt). Thí dụ trong trường hợp trên sai số là 10-10, quá nhỏ và có thể bỏ qua. Không phải chỉ có Excel mà tất cả các phần mềm khác cũng vậy, chúng luôn chứa số thực trong máy ở dạng không chính xác để đỡ tốn bộ nhớ.
 
Hỏi: Dùng Excel và định dạng trang nằm ngang, khi View lên rất đẹp, rất cân đối, nhưng đến khi in thì lại bị lệch trang sang trái. Tôi đã kiểm tra định dạng kiểu trang và máy in (HP LaserJet1100) đều đúng. Một bảng tính khác cũng trong Excel in theo trang ngang lại bình thường. Nguyên nhân và cách khắc phục?



Đáp:

Kết quả in bị lệch trái (hay lệch lên trên trong trường hợp in dọc) so với kết quả Preview thường là do bạn định dạng trang trong bảng tính Excel là khổ “Letter”, nhưng khi in bạn dùng khổ giấy A4 (hấu hết các loại giấy được bán ở thị trường VN là A4). Cách khắc phục là khai báo lại khổ giấy được dùng trong bảng tính đúng với khổ giấy sử dụng. File bảng tính khác cho kết quả in bình thường là vì trong bảng tính đó, bạn đã khai báo đúng khổ giấy A4.
 
Hỏi: Trong Excel làm cách nào đếm đươc tháng hiện tại có bao nhiêu ngày thứ hai, thứ ba,. .?



Đáp:

Bất kỳ ngôn ngữ lập trình nào cũng có thể giúp bạn giải quyết vấn đề này, ở đây là đếm số ngày thứ hai, thứ ba,... chủ nhật trong tháng hiện tại. Điều cốt lõi là giải thuật đếm ngày trong tháng, nếu bạn đã biết giải thuật thì chỉ cần miêu tả giải thuật bằng ngôn ngữ ưa thích. Trong Excel, bạn có thể dùng VBA để viết macro giải quyết vấn đề nào đó. Thí dụ đoạn macro sau sẽ giải quyết vấn đề của bạn:

Option Explicit

‘ Khai báo kiểu chứa thông tin thời gian

Private Type SYSTEMTIME

wYear As Integer

wMonth As Integer

wDayOfWeek As Integer

wDay As Integer

wHour As Integer

wMinute As Integer

wSecond As Integer

wMilliseconds As Integer

End Type

‘ Khai báo hàm API của Windows

Private Declare Sub GetLocalTime Lib “kernel32” (lpSystemTime As SYSTEMTIME)

‘ Khai báo biến cần dùng

Dim Days(0 To 6) As Integer

Dim MinDay As Integer

Dim MaxDay As Integer

‘ Macro đếm ngày

Sub DayCount()

Dim lpSystemTime As SYSTEMTIME

Dim iday As Integer

Dim idayofweek As Integer

‘ Khởi động counter ban đầu

For idayofweek = 0 To 6

Days(idayofweek) = 0

Next

‘ đọc thông tin ngày hiện tại

GetLocalTime lpSystemTime

‘ Tìm ngày nhỏ nhất và lớn nhất trong tháng

MinDay = 1

If (lpSystemTime.wMonth = 2) Then

MaxDay = 28

‘ Nên kiểm tra thêm năm nhuần, có 29 ngày

ElseIf (lpSystemTime.wMonth < 8 And lpSystemTime.wMonth Mod 2) Then

MaxDay = 31

ElseIf (lpSystemTime.wMonth > 7 And (lpSystemTime.wMonth Mod 2) = 0) Then

MaxDay = 31

Else

MaxDay = 30

End If

‘ Tính số ngày trong tuần của tháng hiện tại

iday = lpSystemTime.wDay

idayofweek = lpSystemTime.wDayOfWeek

While (iday <= MaxDay)

Days(idayofweek) = Days(idayofweek) + 1

iday = iday + 1

idayofweek = (idayofweek + 1) Mod 7

Wend

iday = lpSystemTime.wDay

idayofweek = lpSystemTime.wDayOfWeek

Days(idayofweek) = Days(idayofweek) - 1

While (iday >= MinDay)

Days(idayofweek) = Days(idayofweek) + 1

iday = iday - 1

If (idayofweek = 0) Then

idayofweek = 6

Else

idayofweek = idayofweek - 1

End If

Wend

‘ Hiển thị kết quả

MsgBox (“C.Nhat:” & Days(0) & “, T.Hai:” & Days(1) & “, T.Ba:” & Days(2) & “, T.Tu:” & Days(3) & “, T.Nam:” & Days(4) & “, T.Sau:” & Days(5) & “, T.Bay:” & Days(6))
End Sub
 
Hỏi: Trong Excel, khi sử dụng hàm VLOOKUP để tìm kiếm thì hàm này không trả về giá trị tìm kiếm nếu tiêu chuẩn tìm là một số < 1. Đây có phải là một lỗi của Excel hay do hạn chế của hàm này? Có cách khắc phục hay hàm nào thay thế được không? - Để nội suy tuyến tính, ví dụ tìm trị số go khi ro= 4.4 tôi phải dùng cách thủ công là tìm trị số go bằng hàm VLOOKUP ứng với trị số ro lớn hơn và nhỏ hơn 4.4 sau đó dùng công thức nội suy tuyến tính để tính ra trị số go cần tìm, nên vừa chậm vừa không khoa học, trong Excel có hàm nào thực hiện được phép nội suy tuyến tính không hoặc có cách giải quyết nào khác giúp nội suy tuyến tính nhanh chóng hơn không?



Đáp:

Chúng tôi không hiểu thuật ngữ “tiêu chuẩn tìm kiếm” của bạn tương ứng với toán hạng nào của hàm VLOOKUP, hàm này có 4 toán hạng theo đặc tả sau :

VLOOKUP(lookup_value, table_array, col_index_num, range_lookup)

trong đó thông số lookup_value miêu tả trị cần tìm ở cột đầu trong bảng dữ liệu table_array, nếu tìm được thì trả về trị ở cột thứ col_index_num trong bảng (cùng hàng với giá trị tìm kiếm). Thông số range_lookup qui định cột đầu của bảng có thứ tự tăng dần (TRUE) hay không có thứ tự gì cả (FALSE). Do đó để luôn có kết quả tìm kiếm đúng, bạn nên dùng trị FALSE cho thông số thứ 4 này, mặc dù không được nhanh.

Trong trường hợp giá trị cần tìm không có trong bảng và muốn nội suy nó thì bạn phải viết 1 thủ tục dạng macro hay dạng add-ins (chạy nhanh hơn macro) để thực hiện phương pháp nội suy mong muốn. Excel chưa cung cấp hàm nội suy này. Nếu thấy phương pháp nội suy tuyến tính chưa có chính xác cao thì bạn có thể dùng phương pháp nội suy khác để cho kết quả chính xác hơn.
 
Trước khi Post loạt bài không phải của mình như thế này em cũng đã cân nhắc nhưng vì lợi ích của nhiều người nếu có gì sai mong mọi người thông cảm !
Xin nhắc lại những bài viết trên đây đuợc tổng hợp từ http://pcworld.com.vn/
 
Lần chỉnh sửa cuối:
Đây là những kiến thức tổng hợp rất hay về Excel và VBA.

Cám ơn anh skyonline đã dày công sư tầm! !$@!! !$@!! --=0
 
Cho mình hỏi : Có cách nào để mình có thể lấy dữ liệu của 1 file Excel mà không mở file đó không. Ý mình cụ thể là : Giả sử 1 có 1 file chứa rất nhiều dữ liệu(giả sử là file 1); mình lập 1 file excel khác và muốn lấy các thông tin tại file 1 kia. Mình không muốn mở file 1 vì dung lượng rất lớn. Các bạn bầy cho mình với. (Mình diễn đạt hơi lủng củng, mong diễn đàn thông cảm)
 
Các pro giúp em với, em thấy thầy Thanh có hàm myVlookup như sau:
Function myVlookUp(Lookup_Value, lookup_range As Range, index_col As Long)
Dim x As Range
Dim Result As String
Result = ""
For Each x In lookup_range
If x = Lookup_Value Then
Result = Result & ", " & x.Offset(0, index_col - 1)
End If
Next
myVlookUp = Right(Result, Len(Result) - 1)
End Function
em muốn thêm tính năng hàm chỉ tìm đến giá trị thứ n thì dừng không tìm nữa phải làm thế nào:
 

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

Back
Top Bottom