Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Не удаётся сравнить массивы, заданные as String - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Не удаётся сравнить массивы, заданные as String (Макросы/Sub)
Не удаётся сравнить массивы, заданные as String
Roman777 Дата: Пятница, 15.05.2015, 14:32 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Добрый день!
В теме слукавил немного. Сравнить получилось, но... Макрос работает следующий:

Он удаляет все листы из книги, не находящиеся в перечне на первом листе (15 столбце).
Изначально у меня вместо
[vba]
Код
   If Name1sht(i) Like shtName(i1) = True Then
        MsgBox (Name1sht(i) & Chr(13) & shtName(i1))
        sovpal = sovpal + 1
     End If
[/vba]
было
[vba]
Код
  If Name1sht(i) = shtName(i1)  Then
        MsgBox (Name1sht(i) & Chr(13) & shtName(i1))
        sovpal = sovpal + 1
     End If
[/vba]
И вот изначально он не работал (удалял все листы, словно ни один элемент первого массива не равнялся ни единому элементу второго (что неправда).
Может кто-нибудь пояснить, почему изначальный (нижний) вариант не работает?


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Пятница, 15.05.2015, 14:35
 
Ответить
СообщениеДобрый день!
В теме слукавил немного. Сравнить получилось, но... Макрос работает следующий:

Он удаляет все листы из книги, не находящиеся в перечне на первом листе (15 столбце).
Изначально у меня вместо
[vba]
Код
   If Name1sht(i) Like shtName(i1) = True Then
        MsgBox (Name1sht(i) & Chr(13) & shtName(i1))
        sovpal = sovpal + 1
     End If
[/vba]
было
[vba]
Код
  If Name1sht(i) = shtName(i1)  Then
        MsgBox (Name1sht(i) & Chr(13) & shtName(i1))
        sovpal = sovpal + 1
     End If
[/vba]
И вот изначально он не работал (удалял все листы, словно ни один элемент первого массива не равнялся ни единому элементу второго (что неправда).
Может кто-нибудь пояснить, почему изначальный (нижний) вариант не работает?

Автор - Roman777
Дата добавления - 15.05.2015 в 14:32
doober Дата: Пятница, 15.05.2015, 15:07 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010

И вот изначально он не работал

И не будет работать.
У вас несколько открытых книг, обращение к листам у вас , подразумевается , к активной книге.
[vba]
Код

'Вместо   
    If Name1sht(i) Like shtName(i1) = True Then
' Должно быть   
    If (Name1sht(i) Like shtName(i1)) = True Then

Sub УдалениеЛистовПоПеречнюНаПервомЛисте()
      Dim i As Long, i1 As Long, shtCount As Integer
      Dim sht As Worksheet
      Dim Name1sht As Object, Key As String
      Set Name1sht = CreateObject("scripting.dictionary")
      i_n = ThisWorkbook.Worksheets(1).Columns(15).Cells(Rows.Count, 1).End(xlUp).Row
      For i = 1 To i_n
          Key = Worksheets(1).Cells(i, 15)
          Name1sht.Item(Key) = Key
      Next i
      shtCount = Worksheets.Count
      Application.DisplayAlerts = False
      For Each sht In ActiveWorkbook.Worksheets
          Key = sht.Name
          If Name1sht.Exists(Key) Then
               sht.Delete
          End If
      Next sht
      Application.DisplayAlerts = True

End Sub
[/vba]




Сообщение отредактировал doober - Пятница, 15.05.2015, 15:08
 
Ответить
Сообщение

И вот изначально он не работал

И не будет работать.
У вас несколько открытых книг, обращение к листам у вас , подразумевается , к активной книге.
[vba]
Код

'Вместо   
    If Name1sht(i) Like shtName(i1) = True Then
' Должно быть   
    If (Name1sht(i) Like shtName(i1)) = True Then

Sub УдалениеЛистовПоПеречнюНаПервомЛисте()
      Dim i As Long, i1 As Long, shtCount As Integer
      Dim sht As Worksheet
      Dim Name1sht As Object, Key As String
      Set Name1sht = CreateObject("scripting.dictionary")
      i_n = ThisWorkbook.Worksheets(1).Columns(15).Cells(Rows.Count, 1).End(xlUp).Row
      For i = 1 To i_n
          Key = Worksheets(1).Cells(i, 15)
          Name1sht.Item(Key) = Key
      Next i
      shtCount = Worksheets.Count
      Application.DisplayAlerts = False
      For Each sht In ActiveWorkbook.Worksheets
          Key = sht.Name
          If Name1sht.Exists(Key) Then
               sht.Delete
          End If
      Next sht
      Application.DisplayAlerts = True

End Sub
[/vba]

Автор - doober
Дата добавления - 15.05.2015 в 15:07
Hugo Дата: Пятница, 15.05.2015, 15:12 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Что-то оочень много всякого лишнего...
Давайте код в файле - переделаем раз так в 10 короче.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеЧто-то оочень много всякого лишнего...
Давайте код в файле - переделаем раз так в 10 короче.

Автор - Hugo
Дата добавления - 15.05.2015 в 15:12
Roman777 Дата: Пятница, 15.05.2015, 15:14 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
doober, или я сейчас Вас не понял, или Вы меня не поняли. У меня макрос работает (книга открыта одна, собственно даже если не 1, запускаю то я в нужной книге). Не работает изначальный вариант макроса, когда вместо:
[vba]
Код
   If Name1sht(i) Like shtName(i1) = True Then
         MsgBox (Name1sht(i) & Chr(13) & shtName(i1))
         sovpal = sovpal + 1
     End If
[/vba]
написано было:
[vba]
Код
  If Name1sht(i) = shtName(i1)  Then
         MsgBox (Name1sht(i) & Chr(13) & shtName(i1))
         sovpal = sovpal + 1
     End If
[/vba]
И вот тут я разницы не понял, почему же в нижнем варианте не работает, а в верхнем работает.
Ваш вариант, судя по всему, тоже самое что и у меня в конечном варианте, просто выполнен через словарь, я правильно понял?


Много чего не знаю!!!!
 
Ответить
Сообщениеdoober, или я сейчас Вас не понял, или Вы меня не поняли. У меня макрос работает (книга открыта одна, собственно даже если не 1, запускаю то я в нужной книге). Не работает изначальный вариант макроса, когда вместо:
[vba]
Код
   If Name1sht(i) Like shtName(i1) = True Then
         MsgBox (Name1sht(i) & Chr(13) & shtName(i1))
         sovpal = sovpal + 1
     End If
[/vba]
написано было:
[vba]
Код
  If Name1sht(i) = shtName(i1)  Then
         MsgBox (Name1sht(i) & Chr(13) & shtName(i1))
         sovpal = sovpal + 1
     End If
[/vba]
И вот тут я разницы не понял, почему же в нижнем варианте не работает, а в верхнем работает.
Ваш вариант, судя по всему, тоже самое что и у меня в конечном варианте, просто выполнен через словарь, я правильно понял?

Автор - Roman777
Дата добавления - 15.05.2015 в 15:14
Roman777 Дата: Пятница, 15.05.2015, 15:34 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Hugo, Спасибо, будет конечно тоже интересно, но я всё же не по тому вопросу обращался и всё же, файл прикрепил (интересно же).
К сообщению приложен файл: 2718487.rar (65.4 Kb)


Много чего не знаю!!!!
 
Ответить
СообщениеHugo, Спасибо, будет конечно тоже интересно, но я всё же не по тому вопросу обращался и всё же, файл прикрепил (интересно же).

Автор - Roman777
Дата добавления - 15.05.2015 в 15:34
Hugo Дата: Пятница, 15.05.2015, 15:46 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Я пока такой вариант написал, без словаря:
[vba]
Код
Sub УдалениеЛистовПоПеречнюНаПервомЛисте()
       Dim i As Long
       Dim sht As Worksheet
       Dim Key As String
       With ThisWorkbook.Worksheets(1).Columns(15)
           a = Range(.Cells(1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
       End With
       Application.DisplayAlerts = False
       For Each sht In ActiveWorkbook.Worksheets
           Key = sht.Name
           For i = 1 To UBound(a)
               If Key = a(i, 1) Then sht.Delete: Exit For
           Next
       Next sht
       Application.DisplayAlerts = True

End Sub
[/vba]
упс, перепутал - удаляет по списку. Переделаю попозже...
Вот:
[vba]
Код
Sub УдалениеЛистовНеВПеречнеНаПервомЛисте()
     Dim i As Long
     Dim sht As Worksheet
     Dim Key As String
     Dim col As New Collection
     Dim el

     With ThisWorkbook.Worksheets(1).Columns(15)
         a = Range(.Cells(1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
     End With

     For Each sht In ActiveWorkbook.Worksheets
         Key = sht.Name
         col.Add Key
         For i = 1 To UBound(a)
             If Key = a(i, 1) Then col.Remove col.Count: Exit For
         Next
     Next sht
     Application.DisplayAlerts = False
     For Each el In col: Sheets(el).Delete: Next
     Application.DisplayAlerts = True

End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Пятница, 15.05.2015, 16:09
 
Ответить
СообщениеЯ пока такой вариант написал, без словаря:
[vba]
Код
Sub УдалениеЛистовПоПеречнюНаПервомЛисте()
       Dim i As Long
       Dim sht As Worksheet
       Dim Key As String
       With ThisWorkbook.Worksheets(1).Columns(15)
           a = Range(.Cells(1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
       End With
       Application.DisplayAlerts = False
       For Each sht In ActiveWorkbook.Worksheets
           Key = sht.Name
           For i = 1 To UBound(a)
               If Key = a(i, 1) Then sht.Delete: Exit For
           Next
       Next sht
       Application.DisplayAlerts = True

End Sub
[/vba]
упс, перепутал - удаляет по списку. Переделаю попозже...
Вот:
[vba]
Код
Sub УдалениеЛистовНеВПеречнеНаПервомЛисте()
     Dim i As Long
     Dim sht As Worksheet
     Dim Key As String
     Dim col As New Collection
     Dim el

     With ThisWorkbook.Worksheets(1).Columns(15)
         a = Range(.Cells(1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
     End With

     For Each sht In ActiveWorkbook.Worksheets
         Key = sht.Name
         col.Add Key
         For i = 1 To UBound(a)
             If Key = a(i, 1) Then col.Remove col.Count: Exit For
         Next
     Next sht
     Application.DisplayAlerts = False
     For Each el In col: Sheets(el).Delete: Next
     Application.DisplayAlerts = True

End Sub
[/vba]

Автор - Hugo
Дата добавления - 15.05.2015 в 15:46
Roman777 Дата: Пятница, 15.05.2015, 16:19 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
doober, Hugo, спасибо за Ваши варианты! И всё же хотел уточнить вопрос почему так можно:

[vba]
Код
   If Name1sht(i) Like shtName(i1) = True Then
         sovpal = sovpal + 1
     End If
[/vba]

А так незя:
[vba]
Код
  If Name1sht(i) = shtName(i1)  Then
         sovpal = sovpal + 1
     End If
[/vba]
в моём случае (коде).


Много чего не знаю!!!!
 
Ответить
Сообщениеdoober, Hugo, спасибо за Ваши варианты! И всё же хотел уточнить вопрос почему так можно:

[vba]
Код
   If Name1sht(i) Like shtName(i1) = True Then
         sovpal = sovpal + 1
     End If
[/vba]

А так незя:
[vba]
Код
  If Name1sht(i) = shtName(i1)  Then
         sovpal = sovpal + 1
     End If
[/vba]
в моём случае (коде).

Автор - Roman777
Дата добавления - 15.05.2015 в 16:19
Hugo Дата: Пятница, 15.05.2015, 16:33 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
У меня работают оба варианта. Даже странно, думал что первый (с Like) будет работать неправильно :(


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеУ меня работают оба варианта. Даже странно, думал что первый (с Like) будет работать неправильно :(

Автор - Hugo
Дата добавления - 15.05.2015 в 16:33
Roman777 Дата: Пятница, 15.05.2015, 16:48 | Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Я нашёл у себя опечатку :'( , странно что она так повлияла
[vba]
Код
Dim i As Long, i1 As Long, shtCount As Integer, nesovpal As Long
[/vba]
у меня используется переменная "sovpal", а не "nesovpal", после исправления в данной строке "nesovpal" на "sovpal", макрос отработал корректно.


Много чего не знаю!!!!
 
Ответить
СообщениеЯ нашёл у себя опечатку :'( , странно что она так повлияла
[vba]
Код
Dim i As Long, i1 As Long, shtCount As Integer, nesovpal As Long
[/vba]
у меня используется переменная "sovpal", а не "nesovpal", после исправления в данной строке "nesovpal" на "sovpal", макрос отработал корректно.

Автор - Roman777
Дата добавления - 15.05.2015 в 16:48
Roman777 Дата: Пятница, 15.05.2015, 16:53 | Сообщение № 10
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Не, всё же было дело не этом
Я нашёл у себя опечатку , странно что она так повлияла
Dim i As Long, i1 As Long, shtCount As Integer, nesovpal As Long

Сейчас повторно запустил макрос как было (в Сообщении №1), и уже всё-равно робит, а раньше удалял все листы...


Много чего не знаю!!!!
 
Ответить
СообщениеНе, всё же было дело не этом
Я нашёл у себя опечатку , странно что она так повлияла
Dim i As Long, i1 As Long, shtCount As Integer, nesovpal As Long

Сейчас повторно запустил макрос как было (в Сообщении №1), и уже всё-равно робит, а раньше удалял все листы...

Автор - Roman777
Дата добавления - 15.05.2015 в 16:53
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Не удаётся сравнить массивы, заданные as String (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!