Страницы: 1
RSS
Найти лист по имени и внести в него изменения.
 
Имеются листы с именами с Лист1 по Лист46 и есть условие некое.
Нужно перебрать листы, и если условие выполняется то внести в каждый изменения.
Допустим нахожу я имя листа. А Как назначить его активным для внесения изменений именно в него, а то у меня все в первый лист забивает?
Изменено: Kaban - 04.07.2013 19:16:19
 
Чтоб внести изменения - совершенно не нужно назначать лист активным.
Код
1
2
3
4
5
6
Sub tt()
    Dim sh As Worksheet
    For Each sh In Worksheets
        If sh.[a1] = Empty Then sh.[a1] = 1
    Next
End Sub

И вообще, зачем имя?
Или проверять на условие нужно не все листы, а один или несколько определённых? Тогда цикл по массиву имён, проверяем конкретный лист по имени из массива.
Изменено: Hugo - 04.07.2013 17:35:53
 
Да я вообще из 1с-ки к Excel обращаюсь. Это всё и усложняет. Имя листа для меня это уникальный идентификатор в данном случаем.
Есть таблица значений, в одной из колонок в ней имеются номера. Так вот когда номер в колонке совпадает с номером листа в этот лист надо внести изменения. Я сделал перебор строк + перебор листов, но забиваются данные в первый лист. Поэтому нашел я этот форум и сюда пишу... Поэтому и решил что нужно сделать лист активным или выбрать или текущим назначить, не знаю даже  :(  
Пробовал Лист выбирать с Activate и Select: не хочет принимать
Изменено: Kaban - 05.07.2013 09:34:50
 
"забиваются данные в первый лист" потому, что Вы код написали неправильно.
Ещё раз - нет никакой нужды активировать листы. Нужно просто изменить код.
Как пример см. выше - данные заносятся во все листы без всяких активаций.
Ну а как там конкретно в 1С - я не знаю, не работал. Но думаю, что если vbs может корректоно обращаться с листами - то сможет и 1С.

Да и перебор листов по описанию не нужен.
 
Цитата
Hugo пишет:

Да и перебор листов по описанию не нужен.


Вот этим ответом Вы меня совсем запутали. Как тогда обратиться к листу?
Пример, в таблице в колонке идут номера 3, 13, 22, 5
Мне надо найти листы с такими именами (3, 13, 22, 5) и забить в них данные из строки, с соответствующим номером. Я пишу так:
Получаю строку таблицы ТЗ
далее

Для НомерЛиста = 1 По КоличествоЛистов Цикл
ИмяЛиста = КнигаАЗК.WorkSheets(НомерЛиста).Name;
ну и
Если ТЗ.Номер = ИмяЛиста Тогда
ЛистАЗК = КнигаАЗК.Worksheets(ИмяЛиста).Select;
ЛистАЗК.Cells(НомерСтроки, "C").Value = ТЗ.Товар;
и так далее что-то забиваем.....
и все данные попадают в первый лист, а должны в 3, 13, 22 и 5

Какие еще варианты могут быть? Что не так по Вашему мнению?
Изменено: Kaban - 05.07.2013 10:25:34
 
Цитата
Kaban пишет:
А Как назначить его активным
...
когда номер в колонке совпадает с номером листа
Уважаемый Kaban! Надо изначально писать, что у вас имеется некий список "номеров" листов и что надо оттуда взять этот номер. Только вот поясните, что значит "номер листа"? Индекс листа? Имя листа?
There is no knowledge that is not power
 
"Мне надо найти листы с такими именами (3, 13, 22, 5)" - так зачем искать?
Обращайтесь напрямую к sheets("3")  , sheets("13")  , sheets("22")  , sheets("5")  , никаких переборов.
Если возможно, что такого листа может не быть - тогда нужно обработать ошибку. Ну это уже по задаче, это другой вопрос.
Код
1
sheets("13").range("A1")="test"
Изменено: Hugo - 05.07.2013 10:29:21
 
Цитата
Johny пишет:
Уважаемый Kaban! Надо изначально писать, что у вас имеется некий список "номеров" листов и что надо оттуда взять этот номер. Только вот поясните, что значит "номер листа"? Индекс листа? Имя листа?

Из 1с-ки обращаюсь к Excel впервые, что накопал в инете так и написал. Синтаксис возможно не тот, я не знаю.
А номерЛиста это числовая переменная для обращения к Номеру листа Excel чтобы получить дальше его имя.

Цитата
Hugo пишет:
Обращайтесь напрямую к sheets("3"), sheets("13"), sheets("22"), sheets("5"), никаких переборов.

А пройдет так: sheets(НомерЛиста) ??
+использовать range("A1") наверно не могу, т.к. не знаю количество строк. Или можно написать range("A1:G65000") ??
 
Ребят, а можно "для тех кто в танке" написать код?
Есть таблица:
Номер Знач1 Знач2 Знач3
5 142 173 292
44 567 345 789

Мне нужно найти лист с номером как в колонке "Номер" таблицы значений (он может быть любой). (Лист с именем точно существует)
И в этот лист внести изменения поячеично, т.е
ЛистАЗК.Cells(1, "B"  ;)  .Value = ТЗ.Знач1;
ЛистАЗК.Cells(1, "С"  ;)  .Value = ТЗ.Знач2;
ЛистАЗК.Cells(1, "D"  ;)  .Value = ТЗ.Знач3;

У нас жара +30, я туплю похоже или не то спрашиваю. Извините
Изменено: Kaban - 05.07.2013 10:46:28
 
Можно и так
Код
1
sheets(НомерЛиста)

если НомерЛиста=3 или другое число.
Про количество строк - это уже другой вопрос, зависящий от кучи разных обстоятельств...

Только в общем случае нужно писать
Код
1
worksheets(3)
т.к. если будут другие, не рабочие листы - столкнётесь с ошибкой работы.
Изменено: Hugo - 05.07.2013 10:46:57
 
Ну так вся проблема в том, как перебрать эту Вашу таблицу - это уже Ваша 1С сторона.
Далее в экселе просто:

Код
1
2
3
worksheets(n).Cells(1, "B").Value = Знач1
worksheets(n).Cells(1, "C").Value = Знач2
worksheets(n).Cells(1, "D").Value = Знач3
 
Цитата
Hugo пишет:
Только в общем случае нужно писать
Код
1
worksheets(3)
т.к. если будут другие, не рабочие листы - столкнётесь с ошибкой работы.

В итоге должно быть так?
ЛистАЗК = КнигаАЗК.Worksheets(ИмяЛиста)
 
Что за ЛистАЗК и КнигаАЗК?
Но вполне возможна такая строка кода:
Код
1
set ЛистАЗК = КнигаАЗК.Worksheets(ИмяЛиста)

Код
1
2
3
4
5
6
7
8
9
10
11
12
Sub tt()
 
    Dim КнигаАЗК As Workbook, ЛистАЗК As Worksheet, ИмяЛиста As Long
 
    ИмяЛиста = 2
    Set КнигаАЗК = ThisWorkbook
    Set ЛистАЗК = КнигаАЗК.Worksheets(ИмяЛиста)
 
    ЛистАЗК.Range("A1").Value = "test"
    MsgBox ЛистАЗК.Range("A1")
 
End Sub
Изменено: Hugo - 05.07.2013 11:13:58
 
Цитата
Hugo пишет:
Что за ЛистАЗК и КнигаАЗК?
Но вполне возможна такая строка кода:
Код
1
set ЛистАЗК = КнигаАЗК.Worksheets(ИмяЛиста)

Код
1
2
3
4
5
6
7
8
9
10
11
12
Sub tt()
 
    Dim КнигаАЗК As Workbook, ЛистАЗК As Worksheet, ИмяЛиста As Long
 
    ИмяЛиста = 2
    Set КнигаАЗК = ThisWorkbook
    Set ЛистАЗК = КнигаАЗК.Worksheets(ИмяЛиста)
 
    ЛистАЗК.Range("A1").Value = "test"
    MsgBox ЛистАЗК.Range("A1")
 
End Sub


Спасибо, думаю это то,  что надо. Буду копать теперь как перенести это на язык 1с.
 
Только учтите, что Sheets(3) и Sheets("3") - это разные вещи.
There is no knowledge that is not power
 
Цитата
Johny пишет:
Только учтите, что Sheets(3) и Sheets("3") - это разные вещи.

да :)  я уже догадался и исправил.
Страницы: 1
Читают тему
Loading...