Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: ГОСПОДА. Не могу понять Добавлено: 21.11.08 13:27  

Автор вопроса:  slava3577
Здравствуйте, уважаемые Форумчане!
Имеется документ Excel/
В документе 4 листа
3 листа – данные
1 лист – результат
В лист результат сливаются данные из 3 листов (может быть больше)

Вопрос : как устроить перебор листов в файле Excel для записи данных на лист Результат
Option Explicit
Private Sub Worksheet_Activate()
Dim A As Worksheet
    Dim B As Worksheet
    Dim C As Worksheet
    Dim str As Worksheet
    Dim Result As Worksheet
    If MsgBox("Сформировать результат?", vbQuestion + vbYesNo, " ") = vbOK Then Exit Sub
    Set A = ThisWorkbook.Worksheets("Фил")
    Set B = ThisWorkbook.Worksheets("Боб")
    Set C = ThisWorkbook.Worksheets("Про")
    Set Result = ThisWorkbook.Worksheets("Результат")
    Result.Cells.Delete
    Dim i, j, k, var As Integer
    Dim s As String
    Dim sheetname As String
    var = 2
    For k = 65 To 68
        sheetname = Chr(k) ‘ переменная sheetname должна принимать значения A,B,C. После чего она должна использоваться в циклах ниже и выступать в качестве наименования worksheets. Данная переменная принимает значения A,B,C, но ничего не работает.
        i = 2
        j = 1
        Do ‘ перебор строк на листе
            Do ‘ перебор столбцов на листе
               Result.Cells(var, j) = sheetname.Cells(i, j)
               j = j + 1
            Loop While j < 10
            j = 1
            i = i + 1
            var = var + 1
            s = sheetname.Cells(i, 1)
        Loop While Len(s) <> 0
    Next k
    Worksheets("Строгино").Range("A1:K1500").AutoFormat
 End Sub

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 The_Prist



Вопросов: 0
Ответов: 4
 Профиль | | #1 Добавлено: 21.11.08 18:06
Вы поставьте перебор всех листов рабочей книги

  1. For Each Sheet in Worksheets
  2. if Sheet.Name <> "Результат" 'проверка,если это лист с результатами, то он не обрабатывается
  3.           'Ваш код в теле листа
  4. End if
  5. Next

Ответить

Номер ответа: 2
Автор ответа:
 Nytrogen



Вопросов: 18
Ответов: 186
 Профиль | | #2 Добавлено: 21.11.08 18:12
Вы немного не в ту степь забрели. В программировании невозможно напрямую обратиться к переменной по её идентификатору (в Вашем случае Вы пытаетесь получить sheetname.Cells(i, j), подразумевая, что sheetname принимает значения от A до C), несмотря на то, что на уровне человеческого разума это выглядит элементарно. Но как бы то ни было, переменная sheetname - это строка:
  1. Dim sheetname As String

Выражения, подобные sheetname.Cells(i, j) выполняются следующим образом: VB пытается вычислить свойство Cells() у строки sheetname. Поскольку у объекта String нет свойства Cells(), генерируется ошибка.

Даже если и исправить эту ошибку, Ваша идея перебора листов здесь неуместна и неоправданна. Вам следует перебирать листы, используя простой счётчик:
  1. For i = 1 To 3
  2.   ThisWorkbook.Worksheets(i) 'обращение к рабочему листу по индексу
  3. Next i

Ответить

Номер ответа: 3
Автор ответа:
 Nytrogen



Вопросов: 18
Ответов: 186
 Профиль | | #3 Добавлено: 21.11.08 18:13
Или как говорит The_Prist =)

Ответить

Номер ответа: 4
Автор ответа:
 The_Prist



Вопросов: 0
Ответов: 4
 Профиль | | #4 Добавлено: 21.11.08 18:21
Кстати еще вопросик к Вам. А в этой строке
  1.     If MsgBox("Сформировать результат?", vbQuestion + vbYesNo, " ") = vbOK Then Exit Sub
у Вас ошибка не генерируется? Код выполняется?
Просто если Вы хотели сделать, чтобы код выполнялся, то Вам не надо было ставить Exit Sub после нажатия Да.
и во-вторых, если Вы задаете кнопки vbQuestion + vbYesNo, то и действие надо прописывать на эти кнопки.
  1.   If MsgBox("Сформировать результат?", vbQuestion + vbYesNo, " ") = vbYes Then Exit Sub

при нажатии ДА у Вас произойдет выход из процедуры, так что Exit Sub я бы на Вашем месте убрал. Ну и vbOK заменил на vbYes.

Ответить

Номер ответа: 5
Автор ответа:
 slava3577



Вопросов: 2
Ответов: 1
 Профиль | | #5 Добавлено: 24.11.08 16:11
Уважаемый,The_Prist.
  1. If MsgBox("Сформировать результат?", vbQuestion + vbYesNo, " ") = vbOK Then Exit Sub

Как ни странно, всё работает)
Уважаемый, Nytrogen
  1. For i = 1 To 3
  2.   ThisWorkbook.Worksheets(i) 'обращение к рабочему листу по индексу
  3. Next i

Всё заработало. Очень хорошая идея. Спасибо.

Ответить

Номер ответа: 6
Автор ответа:
 xaxaxa



Вопросов: 0
Ответов: 1
 Профиль | | #6 Добавлено: 01.12.08 17:41
А вот возник ещё вопрос.

При переносе данных из документа Excel в другой документ Excel при помощи запроса (Вкладка Данные - Импорт внешних данных -Создать запрос из ячеек переносятся не все данные (из 300 символов переносится примерно 240).
Чем это обусловлено?

Ответить

Номер ответа: 7
Автор ответа:
 Nytrogen



Вопросов: 18
Ответов: 186
 Профиль | | #7 Добавлено: 01.12.08 20:55
Хм... Может ограничено место на каждое поле. А Вы зачем так хитро "переносите"? Может проще скопировать?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам