Khởi tạo nhiều worksheets từ 1 list hoặc table.

  • Thread starter Thread starter dual1
  • Ngày gửi Ngày gửi
Liên hệ QC

dual1

Thành viên mới
Tham gia
17/10/11
Bài viết
1
Được thích
0
Chào các bạn,
Tôi hiện đang có 1 list hoặc 1 bảng (table) trong. Tôi muốn cùng lúc khởi tạo nhiều worksheets tương ứng với mỗi đơn vị trong list hoặc bảng đó. Ví dụ: list có 10 phần tử thì sẽ có 10 worksheets được tạo ra với tên tương ứng với tên của 10 phần tử đó.
Rất mong có được sự chỉ dẫn.
Xin cám ơn.
 
Chào các bạn
Tôi hiện đang có 1 list hoặc 1 bảng (table) trong. Tôi muốn cùng lúc khởi tạo nhiều worksheets tương ứng với mỗi đơn vị trong list hoặc bảng đó. Ví dụ: list có 10 phần tử thì sẽ có 10 worksheets được tạo ra với tên tương ứng với tên của 10 phần tử đó.
Rất mong có được sự chỉ dẫn
Xin cám ơn.
1> Ta cần những code hổ trợ sau
PHP:
Function SheetExist(ByVal WshName As String) As Boolean
  On Error Resume Next
  SheetExist = Not ThisWorkbook.Sheets(WshName) Is Nothing
End Function
PHP:
Function isValidWshName(ByVal WshName As String) As Boolean
  Dim i As Long, InvalidName As String
  InvalidName = ":\/?*[]"
  If Len(WshName) > 31 Or Len(WshName) = 0 Then Exit Function
  For i = 1 To Len(InvalidName)
    If InStr(WshName, Mid(InvalidName, i, 1)) Then Exit Function
  Next
  isValidWshName = True
End Function
PHP:
Sub CreateSheet(ByVal WshNames As Variant)
  Dim TmpArr, Item
  TmpArr = WshNames
  For Each Item In TmpArr
    If isValidWshName(CStr(Item)) Then
      If Not (SheetExist(CStr(Item))) Then
        Sheets.Add(After:=Sheets(Sheets.Count)).Name = CStr(Item)
      End If
    End If
  Next
End Sub

2> Giả sử list chưa tên sheet nằm ở Sheet1, vùng A1:A12. Chạy code này để tạo sheet

PHP:
Sub Main()
  CreateSheet Sheet1.Range("A1:A12")
End Sub
 

File đính kèm

Upvote 0
Xin giải nghĩa hộ cụm If InStr(WshName, Mid(InvalidName, i, 1)) Then Exit

1> Ta cần những code hổ trợ sau
PHP:
Function SheetExist(ByVal WshName As String) As Boolean
  On Error Resume Next
  SheetExist = Not ThisWorkbook.Sheets(WshName) Is Nothing
End Function
PHP:
Function isValidWshName(ByVal WshName As String) As Boolean
  Dim i As Long, InvalidName As String
  InvalidName = ":\/?*[]"
  If Len(WshName) > 31 Or Len(WshName) = 0 Then Exit Function
  For i = 1 To Len(InvalidName)
    If InStr(WshName, Mid(InvalidName, i, 1)) Then Exit Function
  Next
  isValidWshName = True
End Function
PHP:
Sub CreateSheet(ByVal WshNames As Variant)
  Dim TmpArr, Item
  TmpArr = WshNames
  For Each Item In TmpArr
    If isValidWshName(CStr(Item)) Then
      If Not (SheetExist(CStr(Item))) Then
        Sheets.Add(After:=Sheets(Sheets.Count)).Name = CStr(Item)
      End If
    End If
  Next
End Sub

2> Giả sử list chưa tên sheet nằm ở Sheet1, vùng A1:A12. Chạy code này để tạo sheet

PHP:
Sub Main()
  CreateSheet Sheet1.Range("A1:A12")
End Sub
Bình thường sau hàm If đều có dấu (< hoặc <> hoặc =), khi đọc đến đoạn If InStr(WshName, Mid(InvalidName, i, 1)) Then Exit , tôi chưa hiểu nó là gì sao nó không có vế sau (để so sánh).

*********
Hình như ý là nếu tìm thấy (hàm Instr) thì...kết thúc Funtion? Nếu có gì chưa đúng, rất mong mọi người giúp cho.
 
Upvote 0
Bình thường sau hàm If đều có dấu (< hoặc <> hoặc =), khi đọc đến đoạn If InStr(WshName, Mid(InvalidName, i, 1)) Then Exit , tôi chưa hiểu nó là gì sao nó không có vế sau (để so sánh).

*********
Hình như ý là nếu tìm thấy (hàm Instr) thì...kết thúc Funtion? Nếu có gì chưa đúng, rất mong mọi người giúp cho.
Hàm InStr là tìm vị trí của 1 chuổi nhỏ trong chuổi lớn... Kết quả trả về là 1 số >0 chỉ vị trí của chuổi nhỏ trong chuổi lớn... Nếu không tìm thấy thì kết quả sẽ = 0
Ví dụ InStr("abcd", "bc") sẽ cho kết quả = 2 ("bc" nằm ở vị trí thứ 2 trong chuổi "abcd")
If InStr(....) then là viết tắc của If InStr(....) <> 0 then
Đoạn If InStr(WshName, Mid(InvalidName, i, 1)) Then là tìm vị trí của Mid(InvalidName, i, 1) trong WshName
Viết đầy đủ thì nó sẽ là: If InStr(WshName, Mid(InvalidName, i, 1)) <> 0 Then
thế thôi!
 
Upvote 0
Sao tôi cứ thắc mắc mãi
PHP:
If isValidWshName(CStr(Item)) Then
có sự liên hệ nào giữa CStr(Item) và WshName (tôi thấy rằng nó giống nhau thì phải), vậy tại sao không viết cụm trên thành
PHP:
If isValidWshName(WshName) Then
 
Upvote 0
Sao tôi cứ thắc mắc mãi
PHP:
If isValidWshName(CStr(Item)) Then
có sự liên hệ nào giữa CStr(Item) và WshName (tôi thấy rằng nó giống nhau thì phải), vậy tại sao không viết cụm trên thành
PHP:
If isValidWshName(WshName) Then

WshName là tên biến trong hàm isValidWshName
Item là cái của bạn, lấy được từ trong For Next mà ra, rồi truyền vào hàm isValidWshName, vậy xem như Item chính là WshName...
Tuy nhiên, nếu bạn viết If isValidWshName(WshName) Then thì chẳng ra cái gì cả
Lấy 1 ví dụ cụ thể
- Trên bảng tính, bạn gõ hàm =SUM(...) ---> Các biến của hàm SUM là Number1, Number2....
- Thế chẳng lẽ khi áp dụng hàm SUM, bạn cũng lại viết y chang thế: =SUM(Number1, Number2, Number3) hay sao? Chả ai biết Number1, Number2 là giống gì cả vì nó chỉ là tên của biến
- Có phải giá trị bạn truyền vào phải là 1 số cụ thể hoặc 1 vùng cụ thể không? chẳng hạn muốn SUM vùng A1:A10, bạn phải viết thành =SUM(A1:A10)
Đúng chứ
 
Upvote 0
Thày nói làm tôi vỡ ra được nhiều điều, nhưng xin thày giúp cho chút nữa:

If isValidWshName((CStr(Item)) thì sao máy nó hiểu được CStr(Item) chính là các WshName (WshNames) nhỉ? Nó thể hiện ở dòng nào thế?

--------
Hay ta có thể hiểu như sau: Hàm isValidWshName nó là tập hợp của các biến WshName nên thông qua tính toán của Funtion:VBA quy định rằng cứ viết isValidWshName((CStr(Item)) là nó hiểu chính tập hợp các giá trị của WshName tính ra được.

(Vì hiểu biết có hạn, diễn đạt chưa rõ, mong thày chỉ bảo cho).
 
Upvote 0
Thày nói làm tôi vỡ ra được nhiều điều, nhưng xin thày giúp cho chút nữa:

If isValidWshName((CStr(Item)) thì sao máy nó hiểu được CStr(Item) chính là các WshName (WshNames) nhỉ? Nó thể hiện ở dòng nào thế?
Hay ta có thể hiểu như sau: Hàm isValidWshName nó là tập hợp của các biến WshName nên thông qua tính toán của Funtion:VBA quy định rằng cứ viết isValidWshName((CStr(Item)) là nó hiểu chính tập hợp các giá trị của WshName tính ra được.

(Vì hiểu biết có hạn, diễn đạt chưa rõ, mong thày chỉ bảo cho).
- Thứ nhất: "Nó" hiểu được cũng giống y chang như khi bạn gõ =SUM(8, 10) trên bảng tính vậy... Tự nhien "nó" sẽ biết 8 là Number1 và 10 là Number2
- Thứ hai: Hàm isValidWshName với biến WshName (tên này muốn đặt cái gì tùy mình)... và WshName là 1 chuổi nào đó (As String)... Hàm này sẽ tính toán dựa trên cái biến tổng quát này ---> Khi xài, ta sẽ truyền vào 1 chuổi cụ thế
Ví dụ
- Giả sử trong file của bạn đã có hàm isValidWshName
- Giờ bạn gõ vào bảng tính công thức =isValidWshName("abc") chẳng hạn ---> Hàm sẽ cho kết quả =TRUE, ý muốn nói rằng tên "abc" là 1 tên sheet hợp lệ (tức có thể đặt "abc" làm tên sheet)
- Gõ tiếp công thức khác =isValidWshName("ab/c") ---> Hàm sẽ cho kết quả =FALSE, ý muốn nói rằng "ab/c" là tên không hợp lệ (không thể đặt làm tên sheet) ---> Để kiểm chứng, bạn có thể rename sheet thành "ab/c" xem Excel có "cự nự" gì không?
- Tại sao công thức =isValidWshName("ab/c") lại "biết được" kết quả =FALSE ---> Đó là do quá trình tính toán trong code (Function isValidWshName(...) trong cửa sổ VBA)
----------------------
Hic...
Qua cách bạn hỏi bài, tôi cho rằng bạn chưa nắm vững cơ bản... Theo tôi bạn nên học từ đầu chứ không nên "đâm ngang hông" như vậy! Vì càng lúc bạn sẽ càng cảm thấy rối vì những thuật ngữ, cú pháp trong ngôn ngữ lập trình, khiến bạn trở nên hoang mang thêm mà thôi
 
Upvote 0
Vâng, đúng là học kiểu này mệt quá, sờ gì cũng thấy mới, phải chịu khó đọc lại kiến thức cơ bản thôi thày ah.
-----------------
Nhưng vẫn tò mò xin được hỏi thêm: Trong định nghĩa hàm Function isValidWshName(ByVal WshName As String) As Boolean, do có từ bôi xanh (String)nên mới có cụm từ If isValidWshName((CStr(Item)).

Phải chăng 2 cụm từ String & CStr nó phải cùng bản chất như nhau (đều là dạng chuỗi) phải không thày?
 
Upvote 0
Vâng, đúng là học kiểu này mệt quá, sờ gì cũng thấy mới, phải chịu khó đọc lại kiến thức cơ bản thôi thày ah.
-----------------
Nhưng vẫn tò mò xin được hỏi thêm: Trong định nghĩa hàm Function isValidWshName(ByVal WshName As String) As Boolean, do có từ bôi xanh (String)nên mới có cụm từ If isValidWshName((CStr(Item)).

Phải chăng 2 cụm từ String & CStr nó phải cùng bản chất như nhau (đều là dạng chuỗi) phải không thày?
Đúng là vậy!
Không có thằng CStr cũng không sao, nhưng tôi cẩn thận, dùng CStr chuyển dữ liệu về đúng chuẩn String cho "khớp" với kiểu dữ liệu biến WshName...
Đó cũng là 1 cách tăng tốc dữ liệu... Trước khi so sánh, ta chuyển các biến về cùng 1 kiểu dữ liệu, như vậy máy tính sẽ "nhẹ công" hơn (thay vì máy tính phải làm điều này)
 
Upvote 0
Web KT

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

Back
Top Bottom