Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2009, 12:48   #1
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию Прочитать данные из Excel

Есть таблица в файле. В столбцах M-N есть заголовки. Нужно прочитать фамилии, напротив которых в этих столбцах стоят 1. Можно сделать хотя бы для одного столбца, а дальше я сам.
Массив с именами заголовков задается как
Код:
Headers = Array ("руководителю работ", "производителю работ", _
              "допускающему", "с членами бригады", "фамилия", "наблюдающему")
И еще нужно прочитать инициалы из ячейки под фамилией и группу по ТБ. Можно все это записать в массив, запись должна иметь вид: Фамилия И.О. гр. 3
Сделать это макросом. Мне хотя бы наметку, как это делать. Адрес столбца я вытащу, а дальше путаюсь в этих диапазонах
Вложения
Тип файла: rar список персонала1.rar (17.0 Кб, 14 просмотров)
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 03.03.2009, 13:07   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Попробуй так:
Код:
Sub test()
    Application.ScreenUpdating = False
    Dim cell As Range: Set cell = [c9]
    While cell <> ""
        Column13value = cell.EntireRow.Cells("13")
        If Column13value = 1 Then
            ФИО = cell & " " & cell.Offset(1)
            ТабНомер = "Таб. номер " & cell.Previous
            ТБ = "Группа по ТБ " & cell.Next.Next
            Debug.Print ФИО, ТБ, ТабНомер
        End If
        Set cell = cell.Offset(2)
    Wend
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 03.03.2009, 13:11   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

ОК, будем думать.

Попробовал
Выделенная строка не принимает адрес столбца в виде строки. Что делать?
Код:
Sub extractdata()
  Dim i As Long
  Dim sCol As String
  sColumns = Array("руководителю работ", "производителю работ", _
    "допускающему", "с членами бригады", "фамилия", "наблюдающему")
  Dim sColNum As String 'адрес столбца с нужной записью
    Application.ScreenUpdating = False
    Dim oCell As Range: Set oCell = [c9]
   For i = 0 To UBound(sColumns)
     sColNum = Mid(Rows(3).Find(sColumns(i)).Address, InStrRev(Cells.Find(col).Address, "$") - 1, 1)
    Column13value = oCell.EntireRow.Cells(sColNum)
    While oCell <> ""
      If Column13value = 1 Then
        ФИО = cell & " " & cell.Offset(1)
        ТабНомер = "Таб. номер " & cell.Previous
        ТБ = "Группа по ТБ " & cell.Next.Next
        Debug.Print sColumns(i), ФИО, ТБ, ТабНомер
      End If
      Set cell = cell.Offset(2)
    Wend
  Next i
End Sub

Еще раз подумал
Но может быть есть более простой метод?
Код:
    sColNum = Mid(Rows(3).Find(sColumns(i)).Address, InStrRev(Cells.Find(col).Address, "$") - 1, 1)
    sRowNum = Mid(oCell.Address, InStrRev(oCell.Address, "$") + 1, 1)
    Column13value = Range(sColNum & sRowNum)
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 03.03.2009 в 13:35.
viter.alex вне форума Ответить с цитированием
Старый 03.03.2009, 13:54   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Вот такой рабочий вариант, только мне не нравится метод определения номера столбца и строки
Код:
Sub extractdata()
  Dim i As Long
  Dim sCol As String
  sColumns = Array("руководителю работ", "производителю работ", _
    "допускающему", "с членами бригады", "фамилия", "наблюдающему")
  Dim sColNum As String 'адрес столбца с нужной записью
  Dim sRowNum As String
  Application.ScreenUpdating = False
  Dim oCell As Range
  For i = 0 To UBound(sColumns)
    Set oCell = [c9]
    sColNum = Rows(3).Find(sColumns(i)).Address
    sColNum = Mid(sColNum, InStr(sColNum, "$") + 1, InStrRev(sColNum, "$") - InStr(sColNum, "$") - 1)
    While oCell <> ""
      sRowNum = Mid(oCell.Address, InStrRev(oCell.Address, "$") + 1)
      If Range(sColNum & sRowNum) = 1 Then
        ФИО = Trim(oCell) & " " & Trim(oCell.Offset(1))
        ТБ = "Группа по ТБ " & oCell.Next.Next
        Debug.Print sColumns(i), ФИО, ТБ, ТабНомер
      End If
      Set oCell = oCell.Offset(2)
    Wend
  Next i
End Sub
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 03.03.2009, 14:03   #5
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Что-то я запутался в Вашем коде. Что Вы хотите? Так, например, для столбца "M" сформировать массив из элементов, которые оговорены в посте №1
Цитата:
запись должна иметь вид: Фамилия И.О. гр. 3
можно так:
Код:
Sub Main()
    Dim i As Long, j As Long, a()
    ReDim a(0): j = 0
    For i = 9 To Cells(Rows.Count, "M").End(xlUp).Row
        If Cells(i, "M") = 1 Then
            a(j) = Cells(i, "C") & " " & Acr(Cells(i + 1, "C")) & " гр. " & Cells(i, "E")
            ReDim Preserve a(UBound(a) + 1): j = j + 1
        End If
    Next
    ReDim Preserve a(UBound(a) - 1)
End Sub

Function Acr(text) As String
    Dim TextLen As Integer, k As Integer
    text = Application.Trim(text): TextLen = Len(text): Acr = Left(text, 1) & "."
    For k = 2 To TextLen
        If Mid(text, k, 1) = Chr(32) Then Acr = Acr & Mid(text, k + 1, 1)
    Next
    Acr = UCase(Acr)
End Function
В результате получим одномерный массив "a" с требуемыми элементами.
Если нужно, организуйте цикл по столбцам, содержащим заголовки из Вашего массива. Так же можно повставлять различные проверки (или просто игнорировать возможные ошибки).
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 03.03.2009, 14:27   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Может быть нужно получить уникальный список фамилий, инициалов и номеров групп из столбцов с заданными массивом заголовками, в строках которых есть "1" ? Тогда можно так:
Код:
Sub Main()
    Dim i As Long, j As Long, y As Range, z As New Collection, x, a()
    sColumns = Array("руководителю работ", "производителю работ", _
        "допускающему", "с членами бригады", "фамилия", "наблюдающему")
    ReDim a(0): j = 0
    For Each x In sColumns
        Set y = Rows(3).Find(x, LookAt:=xlWhole)
        If Not y Is Nothing Then
            For i = 9 To Cells(Rows.Count, y.Column).End(xlUp).Row
                If Cells(i, y.Column) = 1 Then
                    a(j) = Cells(i, "C") & " " & Acr(Cells(i + 1, "C")) & " гр. " & Cells(i, "E")
                    On Error Resume Next
                    z.Add a(j), CStr(a(j))
                    If Err = 0 Then
                        ReDim Preserve a(UBound(a) + 1): j = j + 1
                    Else: On Error GoTo 0
                    End If
                End If
            Next
        End If
    Next
    ReDim Preserve a(UBound(a) - 1)
    
'Для наглядности, выведем полученный список:

    For i = 0 To UBound(a)
        Msg = Msg & a(i) & vbCrLf
    Next
    MsgBox Msg
        
End Sub

Function Acr(text) As String
    Dim TextLen As Integer, k As Integer
    On Error Resume Next
    text = Application.Trim(text): TextLen = Len(text): Acr = Left(text, 1) & "."
    For k = 2 To TextLen
        If Mid(text, k, 1) = Chr(32) Then Acr = Acr & Mid(text, k + 1, 1)
    Next
    Acr = UCase(Acr)
End Function
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 03.03.2009, 14:31   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Вот как раз с циклом и проблема была. Я ищу в третьей строке ячейку, содержащую строку из массива с названиями. Затем беру столбец этой ячейки и смотрю, стоит ли на пересечении этого столбца и нужной мне строки 1. Если стоит, тогда записываем фамилию, если нет, то идем далььше. В коде есть логические ошибки. Я их уже выловил, а то цикл неправильно считал.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 03.03.2009, 14:35   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если не затруднит, укажите, какие ошибки.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прочитать файл и записать данные в массив ChukCha Общие вопросы C/C++ 6 22.02.2009 19:56
Можно-ли прочитать данные с COM-порта в VBA? Gawwws Microsoft Office Excel 1 28.10.2008 15:26
Как можно быстрее прочитать данные Bagirli Общие вопросы Delphi 6 18.10.2008 11:31
Как прочитать данные из Repeater? posdnyaa БД в Delphi 0 07.04.2008 09:50
Как прочитать данные из самого себя vitalik007 Общие вопросы Delphi 9 16.12.2007 15:52