Dim wkbkdestination As Workbook
Dim destsheet As Worksheet
For Each ThisWorkSheet In wkbkorigin.Worksheets
'this throws subscript out of range if there is not a sheet in the destination
'workbook that has the same name as the current sheet in the origin workbook.
Set destsheet = wkbkdestination.Worksheets(ThisWorkSheet.Name)
Next
Pada dasarnya saya mengulang semua lembar di buku kerja asal lalu mengatur destsheet
di buku kerja tujuan ke lembar dengan nama yang sama seperti yang saat ini diiterasi di buku kerja asal.
Bagaimana saya bisa menguji jika lembar itu ada? Sesuatu seperti:
If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then
Jawaban:
Beberapa orang tidak menyukai pendekatan ini karena penggunaan penanganan kesalahan yang "tidak tepat", tetapi saya pikir itu dianggap dapat diterima di VBA ... Pendekatan alternatif adalah mengulang semua lembar sampai Anda menemukan kecocokan.
sumber
ActiveWorkbook
bukanThisWorkbook
. Yang terakhir merujuk ke buku kerja yang berisi kode makro, yang mungkin berbeda dari buku kerja yang ingin diuji. Saya kiraActiveWorkbook
akan berguna untuk kebanyakan kasus (situasi yang dibuat-buat selalu tersedia).sht Is Nothing
akanTrue
jika tidak ada lembar dengan nama itu, tapi kami ingin kembaliTrue
jika ada adalah sheet dengan nama itu, maka Tidak. Ini sedikit lebih mudah (tetapi tidak valid) jika Anda mengatur ulang sedikit keSheetExists = sht Is Not Nothing
If wb Is Nothing Then Set wb = ThisWorkbook
menjadiIf wb Is Nothing Then Set wb = ActiveWorkbook
Jika Anda hanya tertarik pada lembar kerja, Anda dapat menggunakan panggilan Evaluasi sederhana:
sumber
Anda tidak perlu penanganan kesalahan untuk melakukannya. Yang harus Anda lakukan adalah mengulang semua Lembar Kerja dan memeriksa apakah nama yang ditentukan ada:
sumber
Karena memeriksa anggota suatu koleksi adalah masalah umum, berikut adalah versi abstrak dari jawaban Tim:
Fungsi ini dapat digunakan dengan koleksi apapun seperti objek (
Shapes
,Range
,Names
,Workbooks
, dll).Untuk memeriksa keberadaan sheet, gunakan
If Contains(Sheets, "SheetName") ...
sumber
Set
kata kunci. Saya menemukan bahwa daripada menggunakanSet
, memintaTypeName
anggota koleksi bekerja untuk semua kasus, yaituTypeName objCollection(strName)
Sub Test() On Error GoTo errhandler Debug.Print Contains(Workbooks, "SomeBookThatIsNotOpen") errhandler: If Err.Number <> 0 Then Stop End Sub
Diperbaiki: Tanpa penanganan kesalahan:
sumber
Jika ada yang ingin menghindari VBA dan menguji apakah lembar kerja hanya ada di dalam rumus sel, dimungkinkan menggunakan fungsi
ISREF
danINDIRECT
:=ISREF(INDIRECT("SheetName!A1"))
Ini akan dikembalikan
TRUE
jika buku kerja berisi lembar yang disebutSheetName
danFALSE
sebaliknya.sumber
Saya menulis yang ini:
sumber
sheetExist = ActiveWorkbook.Sheets(sSheet).Index
Solusi saya sangat mirip dengan Tim tetapi juga berfungsi dalam kasus lembar non-lembar kerja - bagan
.
sumber
Letakkan tes dalam suatu fungsi dan Anda akan dapat menggunakannya kembali dan Anda memiliki keterbacaan kode yang lebih baik.
JANGAN gunakan "On Error Resume Next" karena dapat menimbulkan konflik dengan bagian lain dari kode Anda.
sumber
Bertahun-tahun terlambat, tetapi saya hanya perlu melakukan ini dan tidak menyukai solusi yang diposting ... Jadi saya membuat satu, semua berkat keajaiban (gerakan tangan pelangi SpongeBob) "Evaluasi ()"!
Mengembalikan TRUE jika Sheet TIDAK ada; SALAH jika sheet ADA. Anda dapat mengganti rentang apa pun yang Anda suka untuk "1: 1", tetapi saya menyarankan agar tidak menggunakan satu sel, karena jika mengandung kesalahan (misalnya, # N / A), itu akan mengembalikan True.
sumber
wsExists
Fungsi kompak ( tanpa bergantung pada Penanganan Kesalahan!)Berikut adalah fungsi singkat & sederhana yang tidak bergantung pada penanganan kesalahan untuk menentukan apakah lembar kerja ada ( dan dinyatakan berfungsi dengan benar dalam situasi apa pun !)
Contoh Penggunaan:
Contoh berikut menambahkan lembar kerja baru bernama
myNewSheet
, jika belum ada:Informasi Lebih Lanjut:
For Each
…Next
Pernyataan (VBA)Exit
Pernyataan (VBA)sumber
Mengapa tidak menggunakan loop kecil untuk menentukan apakah lembar kerja bernama ada? Katakanlah jika Anda sedang mencari Lembar Kerja bernama "Sheet1" di buku kerja yang saat ini dibuka.
sumber
Jika Anda adalah penggemar
WorksheetFunction.
atau Anda bekerja dari negara non-Inggris dengan Excel non-Inggris, ini adalah solusi yang baik, yang berhasil:Atau dalam fungsi seperti ini:
sumber
sumber
sumber
Ubah "Data" menjadi nama sheet apa pun yang Anda uji ...
sumber
Tanpa ragu bahwa fungsi di atas dapat berfungsi, saya baru saja berakhir dengan kode berikut yang berfungsi dengan cukup baik:
Catatan:
Sheets_Name
adalah tempat saya meminta pengguna untuk memasukkan nama, jadi ini mungkin tidak sama untuk Anda.sumber
Saya melakukan hal lain: hapus lembar hanya jika ada - tidak mendapatkan kesalahan jika tidak:
sumber
Saya menemukan cara mudah untuk melakukannya, tetapi saya tidak membuat sub baru untuk itu. Sebaliknya, saya hanya "memeriksa" di sub-sub yang sedang saya kerjakan. Dengan asumsi nama sheet yang kita cari adalah "Sheet_Exist" dan kita hanya ingin mengaktifkannya jika ditemukan:
Saya juga menambahkan pop-up ketika sheet tidak ada.
sumber
Saya tahu ini adalah posting lama, tetapi ini adalah solusi sederhana lain yang cepat.
sumber
Pendek dan bersih:
sumber
Saya sebenarnya memiliki cara sederhana untuk memeriksa apakah lembar itu ada dan kemudian menjalankan beberapa instruksi:
Dalam kasus saya, saya ingin menghapus sheet dan kemudian membuat ulang sheet yang sama dengan nama yang sama tetapi kode terputus jika program tidak dapat menghapus sheet karena sudah dihapus.
sumber