iNic Пользователь Сообщений: 365 |
Как при открытии книги собрать имена существующих листов в массив? |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
Видимых или и скрытых тоже? <#0> |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#3 12.08.2014 18:51:58 Перебрать их циклом. В модуль книги на открытие:
|
||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#4 12.08.2014 18:59:37 Вариант туда же.
<#0> |
||
vikttur Пользователь Сообщений: 47199 |
#5 12.08.2014 19:00:22 И я. Не пропадать же добру
|
||
iNic Пользователь Сообщений: 365 |
JayBhagavan
и Юрий М , здравствуйте. Вставил на открытие книги код от Юрий М. |
insaidd Пользователь Сообщений: 16 |
Подскажите как записать не все листы в массив а с 3ого, например? Изменено: insaidd — 28.12.2022 15:01:36 |
insaidd Пользователь Сообщений: 16 |
#8 28.12.2022 15:00:25
А как записать не все листы в массив, а только с 3его? |
||||
skais675 Пользователь Сообщений: 2177 |
#9 28.12.2022 15:11:53
Мой канал |
||
МатросНаЗебре Пользователь Сообщений: 5516 |
#10 28.12.2022 15:17:49
|
||
I am trying to have several arrays of my worksheets that I can call up in my code using.
ThisWorkbook.Sheets(Array("Sheet1", "Sheet3"))
ThisWorkbook.Sheets(Array("Sheet2", "Sheet5"))
I am wondering if there is anyway to set up a variable similar to the following:
Dim ArrayOne As String
Dim ArrayTwo As String
ArrayOne = ThisWorkbook.Sheets(Array("Sheet1", "Sheet3"))
ArrayTwo = ThisWorkbook.Sheets(Array("Sheet2", "Sheet5"))
ArrayOne 'Call this Array then save
Filename:="C:Datatestfile.xls", FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _,
CreateBackup:=False
ArrayTwo 'Call this array then save
Filename:="C:Datatestfile.xls", FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _,
CreateBackup:=False
Please let me know if you can help me!!
asked Jun 18, 2013 at 12:44
2
Try using the record macro functionality. It will allow you to select multiple sheets and then copy them into a new book. Next save that book and you are there. Now tinker with the code to get it to work specifically the way you want.
It will come down to:
ThisWorkbook.Sheets(Array("Sheet1", "Sheet3")).Copy
ActiveWorkbook.SaveAs ...
If you want to predefine the arrays, thats is easily done as well; those will just have to contain the names of the sheets. An Array can be created by using a Variable variable:
Dim ArrayOne as Variant
ArrayOne = Array("Sheet1", "Sheet3")
And use that in the .Sheets().Copy
:
ThisWorkbook.Sheets(ArrayOne).Copy
answered Jun 18, 2013 at 13:00
K_BK_B
3,6681 gold badge18 silver badges29 bronze badges
4
Here is an example of how arrays in VBA work:
Sub Example()
Dim ArrayOne() As String
Dim ArrayTwo() As String
Dim ArrayThree As Variant
Dim i As Long
ReDim ArrayOne(1 To Sheets.Count)
ReDim ArrayTwo(1 To 2)
For i = 1 To Sheets.Count
ArrayOne(i) = Sheets(i).Name
Next
ArrayTwo(1) = "Sheet1"
ArrayTwo(2) = "Sheet2"
ArrayThree = Array("Sheet1", "Sheet3")
End Sub
Now from what I understand you do not want to use arrays. You can reference worksheets in your workbook like this:
Sheets("SheetName") 'SheetName is the name of your sheet
Sheets(1) '1 = sheet index
One way to copy sheets to a new workbook to be saved is:
Sub Example()
Dim wkbk As Workbook
ThisWorkbook.Sheets("Sheet1").Copy
Set wkbk = ActiveWorkbook
ThisWorkbook.Sheets("Sheet3").Copy After:=wkbk.Sheets(wkbk.Sheets.Count)
wkbk.SaveAs FileName:="C:New Excel Book.xlsx", _
FileFormat:=xlOpenXMLWorkbook
wkbk.Close
End Sub
answered Jun 18, 2013 at 13:12
RipsterRipster
3,5252 gold badges19 silver badges28 bronze badges
1
I had a similar problem trying to create a dynamic array (not knowing how many sheets there was for me to deal with). I simply used this:
Sub copyArrayOfSheets()
Dim loopArray() As Variant
ReDim Preserve loopArray(1 To 1)
loopArray(1) = "Sheet1" ' a Sheet I know I need to export
j = 1
For Each loopSheet In ThisWorkbook.Sheets
If loopSheet.Name <> "Sheet1" Then
theName = loopSheet.Name
j = j + 1
ReDim Preserve loopArray(1 To j)
loopArray(j) = theName ' Assign the name of the sheets to j-th position of loopArray()
End If
Next loopSheet
Sheets(loopArray()).Copy
Set newBook = ActiveWorkbook
newBook.Activate
End Sub
Hope this helps in any way…
answered Apr 11, 2014 at 13:01
ArthurArthur
1741 gold badge1 silver badge10 bronze badges
1
Following Arthur’s solution (last comment), I had a similar problem (thus reached this post) : I was trying to create a dynamic array, which would save a series of sheets within a Workbook in an array and then perform specific actions with that array.
What is different is that, the user defines the sheets’ names within a range (column) in excel (they represent scenarios for another macro), however this range may be expanded or shortened.
I use 2 arrays, where i run the loop in the first and save the extension each time to the other array (for transparency reasons). Code:
Sub testArray()
Dim a, b As Integer
scenarios_number = Sheets(sheet1).[c1] - 1 ' (this is where i put the # of scenarios / sheets (-1 is used as i want the array to start from 0))
a = 0
Dim Scenarios_array, dimension_array() As Variant
ReDim Scenarios_array(0 To scenarios_number) '(resize array to match the #'s of scenarios)
ReDim dimension_array(0 To a)
For a = 0 To scenarios_number
Scenarios_array(a) = Range("c8").Offset(a, 0).Value '(this is where my scenarios' names start within sheet1 -- using offset for the loop -- this is why i use -1 above as i want a to start @ 0)
ReDim Preserve dimension_array(0 To a) ' (expand dimension of 2nd array)
dimension_array(a) = Scenarios_array(a) ' (save the value in the second array, expaning its dimensions)
Next
MsgBox "Get Ready"
Sheets(dimension_array()).Select
ActiveWindow.SelectedSheets.Delete
End Sub
Hope that helps
Simon
1,4161 gold badge15 silver badges24 bronze badges
answered Jul 20, 2014 at 12:57
I also was trying to do this but I found another way
What i was trying to accomplish was that I have a workbook with multiple sheets and gave them a name. I wanted to select a few sheets and exclude a few sheets that needed to be exported to a different excel file.
Here is (after a lot of searching and trying) my code
Dustin
Dim ii As Integer 'Counter of worksheets
Dim namefile as string 'Variable for name of the new file
namefile = "NameOfNewFile.xlsx" 'Name of new file
For ii = 1 To ThisWorkbook.Sheets.Count 'Counts from 1 to last sheetnumber
If Sheets(ii).Name <> "Namesheet1" Then If Sheets(ii).Name <> "Namesheet2" Then Sheets(ii).Select Replace:=False
'NameSheet1 and NameSheet2 are being exluded from the new file
Next ii
ActiveWindow.SelectedSheets.Copy 'Copies the selected files
Set NewWb = ActiveWorkbook
NewWb.SaveAs Filename:= _
"C:Users" & Environ("UserName") & "Desktop" & namefile, FileFormat:=xlOpenXMLWorkbook
'Saves as xlsx file to desktop
NewWb.Close 'Closes the new file
Set NewWb = Nothing 'Clear NewWb to reduce memory usage
answered Sep 11, 2015 at 14:36
han73r 0 / 0 / 0 Регистрация: 03.06.2015 Сообщений: 30 |
||||||||
1 |
||||||||
Создать массив с названиями листов21.08.2016, 21:43. Показов 10141. Ответов 2 Метки нет (Все метки)
Есть книга, где листы создаются и удаляются макросами. Написано так: ListForm
В Class Modules что написать, чтобы он этот массив сохранял? Справку перерыл не понимаю( SheetsClass
Ругается
0 |
Заблокирован |
||||
22.08.2016, 07:26 |
2 |
|||
Сообщение было отмечено han73r как решение Решение
ругается на Sheets.Countunt Да кто угодно заругается, споткнувшись на никому неведомом слове.
Задался целью создать массив, в котором будут содержаться названия всех листов. Зачем тогда эти пляски с классами?
1 |
0 / 0 / 0 Регистрация: 03.06.2015 Сообщений: 30 |
|
22.08.2016, 10:35 [ТС] |
3 |
Shersh, спасибо, то что нужно) Перемудрил и слова перепутал, поздно было)
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
22.08.2016, 10:35 |
3 |
Я пытаюсь создать массив, содержащий все имена рабочих листов, начиная с 4-го рабочего листа в активной рабочей книге. Я получаю сообщение об ошибке в 4-й строке, когда я пытаюсь изменить размер массива. Чего мне не хватает? В настоящее время существует 6 рабочих листов, третья скрыта (на случай, если что-то изменится).
Dim i As Integer
Dim sheetsToSkip() As Variant
For i = 4 To Sheets.Count
ReDim Preserve sheetsToSkip(UBound(sheetsToSkip) + 1)
sheetsToSkip(UBound(sheetsToSkip)) = Sheets(i).Name
Next i
3 ответа
Лучший ответ
@BigBen на правильном пути. Вы должны ReDim только один раз:
Public Function ListWorkssheets()
Dim SheetsToSkip() As String
Dim Count As Integer
Dim Index As Integer
Count = ThisWorkbook.Worksheets.Count
ReDim SheetsToSkip(1 To Count)
For Index = 1 To Count
SheetsToSkip(Index) = ThisWorkbook.Worksheets((Index + 3 - 1) Mod Count + 1).Name
Next
' Verify.
For Index = LBound(SheetsToSkip) To UBound(SheetsToSkip)
Debug.Print Index, SheetsToSkip(Index)
Next
End Function
0
Gustav
28 Июл 2020 в 08:32
Вот несколько примеров, если сначала вы подсчитаете «действительные» листы (если вы избегаете включать листы по имени) — это поможет.
— Версия 1 — не надо проверять (просто получить все имена листов в массиве)
Sub SheetNamesToArray()
Dim MyWb As Workbook
Dim MySheet As Worksheet
Dim SheetNameArray() As String ' Array of Sheet Names
Dim LP As Integer ' ( Generic Loop Variable )
Set MyWb = ActiveWorkbook
':: Redim to workbook count
ReDim SheetNameArray(MyWb.Sheets.Count)
':: Check Array Size
Debug.Print UBound(SheetNameArray) & " = " & MyWb.Sheets.Count
':: Set Array from Sheet Names
For LP = 1 To MyWb.Sheets.Count
SheetNameArray(LP) = Sheets(LP).Name
Debug.Print SheetNameArray(LP) & " :" & Sheets(LP).Name
Next LP
End Sub
— Версия 2 — проверять имена, сохранять только действительные (используя Inst для проверки, есть ли у нескольких листов определенная строка в имени)
Sub SheetNamesToArray_And_Ignore_Names()
Dim MyWb As Workbook
Dim MySheet As Worksheet
Dim SheetNameArray() As String ' Array of Sheet Names
Dim LP, LPx As Integer ' ( Generic Loop Variable(s) )
Dim MyValidSheetsCount As Integer ' Array Size for only 'valid' sheets
':: Apply to active workbook
Set MyWb = ActiveWorkbook
For LP = 1 To MyWb.Sheets.Count
':: Skip over names to ignore..
If InStr(1, Sheets(LP).Name, "Four", vbTextCompare) = 0 Then
'::Iterate count of 'valid' sheets ::
MyValidSheetsCount = MyValidSheetsCount + 1
End If
Next LP
':: Redim to workbook count
ReDim SheetNameArray(MyValidSheetsCount)
LPx = 0
':: Set Array from Sheet Names
For LP = 1 To MyWb.Sheets.Count
':: Same test again, this time add to array, and iterate index variable ( LPX )
If InStr(1, Sheets(LP).Name, "Four", vbTextCompare) = 0 Then
SheetNameArray(LPx) = Sheets(LP).Name
'::Iterate array index ::
LPx = LPx + 1
End If
Next LP
Debug.Print "Found " & LPx & " valid sheets" & vbNewLine
':: Check only the 'valid' sheets are recorded
For LP = 0 To LPx - 1
Debug.Print "(" & Format(LP, "000#") & ") : " & SheetNameArray(LP)
Next LP
End Sub
С VBA, вероятно, есть несколько способов получить тот же результат.
Для первоначального вопроса, если вы просто пытаетесь пропустить последние 4 и не обеспокоены тем, что они могут быть не в порядке, выполните:
Sub ReallySimpleJustUseNumbers()
':: N.B. Sheets are indexed starting at 1, arrays begin at 0 ..
Dim MyWb As Workbook
Dim MySheet As Worksheet
Dim SheetNameArray() As String ' Array of Sheet Names
Dim LP As Integer ' ( Generic Loop Variable )
Set MyWb = ActiveWorkbook
':: Are there greater than four sheets in this workbook ?
If MyWb.Sheets.Count > 4 Then
':: Redim to workbook count
ReDim SheetNameArray(MyWb.Sheets.Count - 4)
Else
':: Polite Exit
MsgBox "Too Few Sheets buddy"
Exit Sub
End If
For LP = 4 To MyWb.Sheets.Count
SheetNameArray(LP - 4) = MyWb.Sheets(LP).Name
Next LP
':: Output array
For LP = 0 To UBound(SheetNameArray)
Debug.Print LP & " --- " & SheetNameArray(LP)
Next LP
End Sub
Это просто начнет заполнять массив, как определено как Количество листов — Четыре начальных листа, индекс начинается с 0
0
InstantExcel.com
28 Июл 2020 в 01:20
Проблема в том, что ваш массив sheetsToSkip
еще не имеет верхней границы в первом цикле цикла. Вы можете проверить, является ли sheetsToSkip
массивом в первом цикле, а затем либо измерить его в первый раз, либо изменить его размер.
Предложение по коду:
Sub CreateSheetNameArray()
Dim i As Integer
'Brakets are removed
Dim sheetsToSkip As Variant
For i = 4 To Sheets.Count
If IsEmpty(sheetsToSkip) Then
ReDim sheetsToSkip(0 To 0)
Else
ReDim Preserve sheetsToSkip(UBound(sheetsToSkip) + 1)
End If
sheetsToSkip(UBound(sheetsToSkip)) = Sheets(i).Name
Next i
End Sub
Помните, что ReDim Preserve
медленный. Если у вас есть много циклов цикла, вы можете просто измерять массив перед циклом.
0
Michael Wycisk
28 Июл 2020 в 00:19
Вывод в массив данных с двух листов книги |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |