Đếm số sheet trong workbok? (1 người xem)

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

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

van_v

Thành viên mới
Tham gia
23/6/08
Bài viết
11
Được thích
0
cám ơn mọi người đã chỉ tôi nhưng chỗ sai trong cách lập hàm của mình ở những bài trước. hôm nay mọi người có thêt chir tôi làm thế nào để đếm số shêt tróng workbok không, tôi cần tìm và thay thế một số điẻm trong các sheet đó nhưng không biết làm tế nào để đếm chúng cho chính xác là đã thay hết chưa. cám ơn mọi người.
 
Bạn đặt name VD: Sosh
Sosh=GET.WORKBOOK(4)
Xong gõ Sosh ở ô nào đó bạn sẽ biết được file có bao nhiêu sheet.
Thân.
Nên là:
Mã:
SoSh = GET.WORKBOOK(4) + 0*NOW()
Hoặc
Mã:
SoSh = GET.WORKBOOK(ROW(INDIRECT("A4")))
Để cho việc tự động cập nhật được tốt hơn (khi thêm hoặc xóa bớt sheet)
 
mọi người có thể chỉ e rõ giúp em rõ hơn không.em nên đặt name tại ô nào. và "=GET.WOKBOOK(4)+0*NOW() cs phải là một công tức ễcl không. em không rành về code lắm. cám ơn mọi người trước nha
 
Chào bạn!
Bạn có thể đặt name như sau:
+ Vào Insert-->Name-->Define--> xuất hiện 1 khung
+ Tại ô: Name in workbok bạn gõ:"SoSh" ( hoặc tên nào đó bạn thích)
+ Tại ô:Refers to bạn đánh công thức: = GET.WORKBOOK(4) + 0*NOW()
+ Sau đó tại 1 cells nào đó bạn gõ: =SoSh--> Enter là ra kết quả liền hà

Chúc bạn thành công!

Chào bạn!
 
mọi người có thể chỉ e rõ giúp em rõ hơn không.em nên đặt name tại ô nào. và "=GET.WOKBOOK(4)+0*NOW() cs phải là một công tức ễcl không. em không rành về code lắm. cám ơn mọi người trước nha
Cách đặt name thì bài trên đã nói rồi, tôi nói thêm 1 chút: hàm này không phải là hàm Excel thông thường, nó là hàm macro 4, có từ thời xa xưa nhưng do ứng dụng của nó vẩn còn rất hửu ích nên đến nay vẩn còn người dùng... Với bộ hàm này, có cái đặt name được, có cái thì không (tùy)
Tải file trong bài #9 tại đây để hiểu thêm về macro 4:
http://www.giaiphapexcel.com/forum/showthread.php?t=202
 
Sau mấy ngày tìm hiểu em thấy còn cái này,không phải dung code:=info("numfile") nó cũng cho kết quả
 
Mình nghĩ là ngocchung89 đúng đó.
Mình test file trên Excel 2007 thấy đúng đó!
Thân chào và chúc sức khỏe!
Còn mình thì cho rằng bạn Volga nói chính xác
Bạn thử dùng hàm này khi mở 2 hoặc 3 file cùng lúc xem (Excel 2003 hay 2007 gì cũng vậy)
Tóm lại: Hàm này ra kết quả là tổng số sheet của tất cả các file đang mở chứ không phải của file hiện hành đâu ---> Không dùng được!
 
Còn mình thì cho rằng bạn Volga nói chính xác
Bạn thử dùng hàm này khi mở 2 hoặc 3 file cùng lúc xem (Excel 2003 hay 2007 gì cũng vậy)
Tóm lại: Hàm này ra kết quả là tổng số sheet của tất cả các file đang mở chứ không phải của file hiện hành đâu ---> Không dùng được!
Ý mình cũng như vậy mà!
Nhưng cho mình hỏi tí:
Mình mở 1 file mới, rồi mở thêm 1 file mới nữa là 2 file đúng không?
Nhưng mình nhập hàm này vào trong 1 sheet của 1 file thì kết quả là 3 là sao? phải 3 sheet không?
Mã:
=INFO("numfile")
Rồi sao đó mình thêm thử một sheet trong file có công thức trên, kết quả của hàm này không cập nhật được mà phải gõ lại, kết quả thay đổi là 4.
Vậy là sao?
Bạn có thể giải thích thêm về hàm này không?
Thân chào và chúc sức khỏe?
 
Ý mình cũng như vậy mà!
Nhưng cho mình hỏi tí:
Mình mở 1 file mới, rồi mở thêm 1 file mới nữa là 2 file đúng không?
Nhưng mình nhập hàm này vào trong 1 sheet của 1 file thì kết quả là 3 là sao? phải 3 sheet không?
Mã:
=INFO("numfile")
Rồi sao đó mình thêm thử một sheet trong file có công thức trên, kết quả của hàm này không cập nhật được mà phải gõ lại, kết quả thay đổi là 4.
Vậy là sao?
Bạn có thể giải thích thêm về hàm này không?
Thân chào và chúc sức khỏe?
Hàm này dùng trong Excel 2007 cho kết quả chính xác hơn
Có thể trong Excel 2003 hàm này tính luôn sheet ẩn là sheet History chăng? (nó tự cộng thêm 1 sheet nữa)
 
Hàm này dùng trong Excel 2007 cho kết quả chính xác hơn
Có thể trong Excel 2003 hàm này tính luôn sheet ẩn là sheet History chăng? (nó tự cộng thêm 1 sheet nữa)
Cám ơn nhé, vậy là hàm này không thể dùng để đếm số sheet của tất cả các file Excel đang mở đúng không?
Thân chào và chúc sức khỏe!
 
Nên là:
Mã:
SoSh = GET.WORKBOOK(4) + 0*NOW()
Hoặc
Mã:
SoSh = GET.WORKBOOK(ROW(INDIRECT("A4")))
Để cho việc tự động cập nhật được tốt hơn (khi thêm hoặc xóa bớt sheet)
Xin hướng dẫn em như sau:
Trong Workbook của em có nhiều Sheet, trong đó có một số Sheet là T01, T02, TNam ...bây giờ em muốn biết Tổng số Sheet có chữ đầu tiên là T thì làm thế nào. (lưu ý vì số lượng Sheet quá nhiều, nên em có ẩn Sheet bằng Format/Sheet/Hide)
Em cảm ơn!
 
Xin hướng dẫn em như sau:
Trong Workbook của em có nhiều Sheet, trong đó có một số Sheet là T01, T02, TNam ...bây giờ em muốn biết Tổng số Sheet có chữ đầu tiên là T thì làm thế nào. (lưu ý vì số lượng Sheet quá nhiều, nên em có ẩn Sheet bằng Format/Sheet/Hide)
Em cảm ơn!
Bạn có thể dùng code
PHP:
Sub DemSheet()
Dim Sh As Worksheet
Dim Tmp As Long
For Each Sh In ThisWorkbook.Worksheets
  If Left(Sh.Name, 1) = "T" Then
    Tmp = Tmp + 1
  End If
Next
MsgBox Tmp
End Sub
 
Bạn có thể dùng code
PHP:
Sub DemSheet()
Dim Sh As Worksheet
Dim Tmp As Long
For Each Sh In ThisWorkbook.Worksheets
  If Left(Sh.Name, 1) = "T" Then
    Tmp = Tmp + 1
  End If
Next
MsgBox Tmp
End Sub

em nghĩ Tmp kiểu byte là hợp lý nhất, vì 1 workbooks không không hơn 100 sheet đâu.
 
theo mình thì bye hay interger thì sau khi máy xử lý đều chuyển thành as long hết.
Câu này hem đúng anh nha, nếu thế người ta sinh ra 2 loại biến đó làm chi, với những chương trình lớn nếu biết tận dụng các biến này một cách tối đa thì tiết kiệm được kha khá bộ nhớ của máy tính đó. Trên diễn đàn chúng ta chỉ viết những đoạn chương trình nhỏ nên chúng ta chưa quan tâm đến việc tiết kiệm bộ nhớ máy tính vì thế nên mới khai báo tất là Long cho chắc.
 
Câu này hem đúng anh nha, nếu thế người ta sinh ra 2 loại biến đó làm chi, với những chương trình lớn nếu biết tận dụng các biến này một cách tối đa thì tiết kiệm được kha khá bộ nhớ của máy tính đó. Trên diễn đàn chúng ta chỉ viết những đoạn chương trình nhỏ nên chúng ta chưa quan tâm đến việc tiết kiệm bộ nhớ máy tính vì thế nên mới khai báo tất là Long cho chắc.
chắc phải để các sư phụ giải thích. tôi thì xem các code API họ ít khi xử dụng bye mà toàn sử dung LOng. chẳng lẽ code được win hỗ trợ lại là trương trình nhỏ
 
Bạn có thể dùng code
PHP:
Sub DemSheet()
Dim Sh As Worksheet
Dim Tmp As Long
For Each Sh In ThisWorkbook.Worksheets
  If Left(Sh.Name, 1) = "T" Then
    Tmp = Tmp + 1
  End If
Next
MsgBox Tmp
End Sub
Em cảm ơn anh.
Anh giúp em thêm một tí, em muốn Kết quả thể hiện tại Cell A1 của Sheet "Ma" thì làm cách nào? (không cần thông báo Msgbox)
 
chắc phải để các sư phụ giải thích. tôi thì xem các code API họ ít khi xử dụng bye mà toàn sử dung LOng. chẳng lẽ code được win hỗ trợ lại là trương trình nhỏ
Không đâu anh Duy thương. mỗi biến được lưu một giá trị, mà giá trị có thể lớn hoặc nhỏ nên theo đó mình phải khai báo cho phù hợp, Còn trong 1 chương trình cho dù chương trình đó lớn tới cỡ nào đi chăng nữa nhưng nếu các biến của nó không có lưu giá trị lớn thì nó cũng khai báo kiểu nho nhỏ thôi
ví dụ
có 1 vài trường hợp biến chỉ được nhận 1 trong 2 giá trị(tại sao người ta không sử dụng kiểu, byte, long hoặc integer để lưu) mà chọn kiểu Boolean, vì kiểu boolean phù hợp với yêu cầu và tiết kiệm được nhiều bộ nhớ
nếu mình nhận định được các giá trị mà biến có thể lưu thì mình nên đặt bộ nhớ cho thích hợp
(do hiện nay tộc độ cũng như bộ nhớ máy tính nhiều nên anh thấy không vấn đề gì, nếu anh chạy file lớn mà không để ý đến biến là nguy hiểm lắm đó)
 
Lần chỉnh sửa cuối:
Không đâu anh Duy thương. mỗi biến được lưu một giá trị, mà giá trị có thể lớn hoặc nhỏ nên theo đó mình phải khai báo cho phù hợp, Còn trong 1 chương trình cho dù chương trình đó lớn tới cỡ nào đi chăng nữa nhưng nếu các biến của nó không có lưu giá trị lớn thì nó cũng khai báo kiểu nho nhỏ thôi
ví dụ
có 1 vài trường hợp biến chỉ được nhận 1 trong 2 giá trị(tại sao người ta không sử dụng kiểu, byte, long hoặc integer để lưu) mà chọn kiểu Boolean, vì kiểu boolean phù hợp với yêu cầu và tiết kiệm được nhiều bộ nhớ
nếu mình nhận định được các giá trị mà biến có thể lưu thì mình nên đặt bộ nhớ cho thích hợp
(do hiện nay tộc độ cũng như bộ nhớ máy tính nhiều nên anh thấy không vấn đề gì, nếu anh chạy file lớn mà không để ý đến biến là nguy hiểm lắm đó)
Vụ này đã bàn rất nhiều lần rồi (bạn tìm sẽ thấy).... Riêng tôi thì cóc thèm xài mấy thằng Byte hay Interger cho mệt, cứ Long mà phang..
-----------------
Em cảm ơn anh.
Anh giúp em thêm một tí, em muốn Kết quả thể hiện tại Cell A1 của Sheet "Ma" thì làm cách nào? (không cần thông báo Msgbox)
Bạn có thể dùng công thức như sau:
- Đặt name:
PHP:
ShN = GET.WORKBOOK(ROW(INDIRECT("A1")))
- Công thức tại cell A1:
PHP:
=SUMPRODUCT((LEN(ShN)-LEN(SUBSTITUTE(ShN,"]T","")))/2)
 
chắc phải để các sư phụ giải thích. tôi thì xem các code API họ ít khi xử dụng bye mà toàn sử dung LOng. chẳng lẽ code được win hỗ trợ lại là trương trình nhỏ
Em không biết gì về API cả, đây chỉ là những kiến thức cơ bản về Macro mà các sư phụ tigertiger dạy em trước đó. Em còn nhớ rõ trong một bài giảng về khai báo biến sư phụ có lấy ví dụ thế này: nếu ta muốn dùng 1 biến để chứa các tháng thì chỉ cần khai báo kiểu byte là đủ vì các tháng chỉ từ 1 đến 12 mà giới hạn của byte là từ 0 đến 255 vì thế khai báo là Long thì hơi phí. Trong các chương trình nhỏ thì nó ko ảnh hưởng gì nhưng trong các chương trình lớn nếu chúng ta biết rõ giới hạn của biến thì nên khai báo chuẩn để tiết kiệm bộ nhớ cho máy tính giúp chương trình chạy nhanh hơn.
Vài dòng chia sẻ!!!
 
Lần chỉnh sửa cuối:
Em không biết gì về API cả, đây chỉ là những kiến thức cơ bản về Macro mà sư phụ tigertiger dạy em trước đó. Em còn nhớ rõ trong một bài giảng về khai báo biến sư phụ có lấy ví dụ thế này: nếu ta muốn dùng 1 biến để chứa các tháng thì chỉ cần khai báo kiểu byte là đủ vì các tháng chỉ từ 1 đến 12 mà giới hạn của byte là từ 0 đến 255 vì thế khai báo là Long thì hơi phí. Trong các chương trình nhỏ thì nó ko ảnh hưởng gì nhưng trong các chương trình lớn nếu chúng ta biết rõ giới hạn của biến thì nên khai báo chuẩn để tiết kiệm bộ nhớ cho máy tính giúp chương trình chạy nhanh hơn.
Vài dòng chia sẻ!!!

Vậy thì bạn nên xem qua bài này:
http://www.giaiphapexcel.com/forum/showthread.php?13255-Biến-integer-biến-long-cái-nào-nhanh-hơn
Toàn là những sư phụ hàng đầu GPE tranh luận, chắc đủ uy tín chứ
 
Cách đặt name thì bài trên đã nói rồi, tôi nói thêm 1 chút: hàm này không phải là hàm Excel thông thường, nó là hàm macro 4, có từ thời xa xưa nhưng do ứng dụng của nó vẩn còn rất hửu ích nên đến nay vẩn còn người dùng... Với bộ hàm này, có cái đặt name được, có cái thì không (tùy)
Em không đặt Name được! các thầy cô & anh chị hướng dẫn em tiếp phần cài macro 4 này.
Em cảm ơn.
 
Em không đặt Name được! các thầy cô & anh chị hướng dẫn em tiếp phần cài macro 4 này.
Em cảm ơn.

Sao mà không được chứ! Copy paste vào thôi mà
Lưu ý: Macro 4 cũng là macro, vì vậy phải Enable Macro thì công thức mới chạy
 

File đính kèm

Ý mình cũng như vậy mà!
Nhưng cho mình hỏi tí:
Mình mở 1 file mới, rồi mở thêm 1 file mới nữa là 2 file đúng không?
Nhưng mình nhập hàm này vào trong 1 sheet của 1 file thì kết quả là 3 là sao? phải 3 sheet không?
Mã:
=INFO("numfile")
Rồi sao đó mình thêm thử một sheet trong file có công thức trên, kết quả của hàm này không cập nhật được mà phải gõ lại, kết quả thay đổi là 4.
Vậy là sao?
Bạn có thể giải thích thêm về hàm này không?
Thân chào và chúc sức khỏe?

Trả lời bạn:
Mã:
=INFO("numfile")
Là tổng số sheets của tất cả các workbook bạn đang mở bạn nhé!

_________________________________
skygift.vn - golaza.vn
 
có 1 vài trường hợp biến chỉ được nhận 1 trong 2 giá trị(tại sao người ta không sử dụng kiểu, byte, long hoặc integer để lưu) mà chọn kiểu Boolean, vì kiểu boolean phù hợp với yêu cầu và tiết kiệm được nhiều bộ nhớ
Có chắc không vậy, khi nói đên boolean ai chả biết về mặt lưu thông tin thì nó lưu được hai giá trị ( chỉ cần một bít, về mặt logic). Tuy nhiên xét trên khía cạnh vật lý thì nó lại ngốn 2 byte nhé. Đố mọi người biết tại sao nó lại không dùng một bít ( vật lý).
 
Có chắc không vậy, khi nói đên boolean ai chả biết về mặt lưu thông tin thì nó lưu được hai giá trị ( chỉ cần một bít, về mặt logic). Tuy nhiên xét trên khía cạnh vật lý thì nó lại ngốn 2 byte nhé. Đố mọi người biết tại sao nó lại không dùng một bít ( vật lý).
Biến kiểu Boolean nó chỉ chiếm 1 byte trong bộ nhớ thôi bạn, còn tại sao các kiểu dữ liệu được lưu bằng đơn vị i là byte cái này bạn học các môn lập trình cơ sở sẽ biết
 
Biến kiểu Boolean nó chỉ chiếm 1 byte trong bộ nhớ thôi bạn, còn tại sao các kiểu dữ liệu được lưu bằng đơn vị i là byte cái này bạn học các môn lập trình cơ sở sẽ biết
Lập trình cơ sở nói về một ngôn ngữ lý tưởng (ideal language). VBA không phải là ngôn ngữ lập trình lý tưởng.
Trong VBA, Boolean là một Integer. Và cách sử lý trị của nó cũng khá rối rắm.
Nêu 0 thì là false, nếu bất cứ bit nào trong 16 bits của nó khác 0 thì là True. Mặc định True là tất cả các bits đều khác 0.

Nói chung thì cái chuyện nhanh chậm và tốn bộ nhớ chỉ là chuyện 20 năm về trước. Thời buổi bây giờ CPU có khả năng lấy nhiều bytes 1 lúc, và máy tính có bộ nhớ lớn. Chuyện kích cỡ của trị nguyên nó gần như không quan trọng, dùng byte chỉ thêm phần rắc rối với khả năng bị tràn số. Trừ phi bạn tạo bảng dò (bit map) hoặc dùng mảng rất lớn (cỡ triệu phần tử) hoặc dùng hàm đệ quy.
Byte cũng có lợi điểm là nó tránh cho bạn trường hợp lựa chọn big/small endian. Tuy nhiên, đây là loại lập trình cao cấp và lập trình nhúng (embedding)
 
Có cách nào mình kiểm tra tổng số sheet mình add vào thiếu hay ko.
 
Lập trình cơ sở nói về một ngôn ngữ lý tưởng (ideal language). VBA không phải là ngôn ngữ lập trình lý tưởng.
Trong VBA, Boolean là một Integer. Và cách sử lý trị của nó cũng khá rối rắm.
Nêu 0 thì là false, nếu bất cứ bit nào trong 16 bits của nó khác 0 thì là True. Mặc định True là tất cả các bits đều khác 0.

Nói chung thì cái chuyện nhanh chậm và tốn bộ nhớ chỉ là chuyện 20 năm về trước. Thời buổi bây giờ CPU có khả năng lấy nhiều bytes 1 lúc, và máy tính có bộ nhớ lớn. Chuyện kích cỡ của trị nguyên nó gần như không quan trọng, dùng byte chỉ thêm phần rắc rối với khả năng bị tràn số. Trừ phi bạn tạo bảng dò (bit map) hoặc dùng mảng rất lớn (cỡ triệu phần tử) hoặc dùng hàm đệ quy.
Byte cũng có lợi điểm là nó tránh cho bạn trường hợp lựa chọn big/small endian. Tuy nhiên, đây là loại lập trình cao cấp và lập trình nhúng (embedding)

gop vui

[CODE
#include <stdio.h>
#include <Python.h>
#include <pyhelper.hpp>

static PyObject* arnav_foo(PyObject* self, PyObject* args)
{
printf_s("... in C++...: foo() method\n");
return PyLong_FromLong(51);
}

static PyObject* arnav_show(PyObject* self, PyObject* args)
{
PyObject *a;
if(PyArg_UnpackTuple(args, "", 1, 1, &a))
{
printf_s("C++: show(%ld)\n", PyLong_AsLong(a));
}

return PyLong_FromLong(0);
}

static struct PyMethodDef methods[] = {
{ "foo", arnav_foo, METH_VARARGS, "Returns the number"},
{ "show", arnav_show, METH_VARARGS, "Show a number" },
{ NULL, NULL, 0, NULL }
};

static struct PyModuleDef modDef = {
PyModuleDef_HEAD_INIT, "arnav", NULL, -1, methods,
NULL, NULL, NULL, NULL
};

static PyObject* PyInit_arnav(void)
{
return PyModule_Create(&modDef);
}

int main()
{
PyImport_AppendInittab("arnav", &PyInit_arnav);

CPyInstance hInstance;

const char pFile[] = "pyemb6.py";
FILE* fp = _Py_fopen(pFile, "r");
PyRun_AnyFile(fp, pFile);

return 0;
}

/CODE]
Bài đã được tự động gộp:

Lập trình cơ sở nói về một ngôn ngữ lý tưởng (ideal language). VBA không phải là ngôn ngữ lập trình lý tưởng.
Trong VBA, Boolean là một Integer. Và cách sử lý trị của nó cũng khá rối rắm.
Nêu 0 thì là false, nếu bất cứ bit nào trong 16 bits của nó khác 0 thì là True. Mặc định True là tất cả các bits đều khác 0.

Nói chung thì cái chuyện nhanh chậm và tốn bộ nhớ chỉ là chuyện 20 năm về trước. Thời buổi bây giờ CPU có khả năng lấy nhiều bytes 1 lúc, và máy tính có bộ nhớ lớn. Chuyện kích cỡ của trị nguyên nó gần như không quan trọng, dùng byte chỉ thêm phần rắc rối với khả năng bị tràn số. Trừ phi bạn tạo bảng dò (bit map) hoặc dùng mảng rất lớn (cỡ triệu phần tử) hoặc dùng hàm đệ quy.
Byte cũng có lợi điểm là nó tránh cho bạn trường hợp lựa chọn big/small endian. Tuy nhiên, đây là loại lập trình cao cấp và lập trình nhúng (embedding)
Gop Vui


#include <stdio.h>
#include <Python.h>
#include <pyhelper.hpp>

static PyObject* arnav_foo(PyObject* self, PyObject* args)
{
printf_s("... in C++...: foo() method\n");
return PyLong_FromLong(51);
}

static PyObject* arnav_show(PyObject* self, PyObject* args)
{
PyObject *a;
if(PyArg_UnpackTuple(args, "", 1, 1, &a))
{
printf_s("C++: show(%ld)\n", PyLong_AsLong(a));
}

return PyLong_FromLong(0);
}

static struct PyMethodDef methods[] = {
{ "foo", arnav_foo, METH_VARARGS, "Returns the number"},
{ "show", arnav_show, METH_VARARGS, "Show a number" },
{ NULL, NULL, 0, NULL }
};

static struct PyModuleDef modDef = {
PyModuleDef_HEAD_INIT, "arnav", NULL, -1, methods,
NULL, NULL, NULL, NULL
};

static PyObject* PyInit_arnav(void)
{
return PyModule_Create(&modDef);
}

int main()
{
PyImport_AppendInittab("arnav", &PyInit_arnav);

CPyInstance hInstance;

const char pFile[] = "pyemb6.py";
FILE* fp = _Py_fopen(pFile, "r");
PyRun_AnyFile(fp, pFile);

return 0;
}
 
gop vui

[CODE
#include <stdio.h>
#include <Python.h>
#include <pyhelper.hpp>

static PyObject* arnav_foo(PyObject* self, PyObject* args)
{
printf_s("... in C++...: foo() method\n");
return PyLong_FromLong(51);
}

static PyObject* arnav_show(PyObject* self, PyObject* args)
{
PyObject *a;
if(PyArg_UnpackTuple(args, "", 1, 1, &a))
{
printf_s("C++: show(%ld)\n", PyLong_AsLong(a));
}

return PyLong_FromLong(0);
}

static struct PyMethodDef methods[] = {
....

Lại cái tật chôm chĩa không biết chừa:
(https://www .codeproject. com/Articles/820116/Embedding-Python-program-in-a-C-Cplusplus-code)

1591934110409.png
 

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

Back
Top Bottom