Хы, а где об этом говорилось раньше? Макрос тупо считывает подряд строки, а скрытые они или нет ему фиолетово. Вот так будет пропускать скрытые строки
[vba]
Код
Option Explicit
Const NOTHYP As String = "В ячейке нет гиперссылки!"
Private Function getHyperlinkAddress(ByVal rCell As Range) As String Dim S As String If rCell.Hyperlinks.Count = 0 Then If Mid$(rCell.Formula, 2, 9) = "HYPERLINK" Then getHyperlinkAddress = Mid$(rCell.Formula, 13, InStr(13, rCell.Formula, Chr(34)) - 13) Else getHyperlinkAddress = NOTHYP End If Else S = rCell.Hyperlinks(1).SubAddress If S <> "" Then S = "#" & rCell.Hyperlinks(1).SubAddress getHyperlinkAddress = rCell.Hyperlinks(rCell.Hyperlinks.Count).Address & S End If End Function
''===
Public Sub main() Dim rowLast As Long, i&, rowStart&, j& Dim clnStart As Byte, clnDelt As Byte Dim str1 As String Const outFile As String = "resultat.nc"
str1 = ThisWorkbook.Path & "/" & outFile Open str1 For Output As #1 With ThisWorkbook.ActiveSheet rowLast = .Cells(Rows.Count, 4).End(xlUp).Row rowStart = 0 clnStart = 4 clnDelt = 4 For i = 1 To 100 If .Cells(i, clnStart).Text = "%" Then rowStart = i Exit For End If Next i If rowStart = 0 Then MsgBox "В первых 100 строках не найдена ячейка, равная %. Макрос остановлен.", 48, "Не найдено" Close #1 Exit Sub
End If For i = 1 To rowLast If .Rows(i).Hidden = False Then str1 = getHyperlinkAddress(.Range(.Cells(i, clnStart).Address))
If str1 <> NOTHYP Then If InStr(str1, ":\") = 0 Then str1 = ThisWorkbook.Path & "/" & str1 End If If Dir(str1) = "" Then Close #1 MsgBox "Не найден файл " & str1 & ". Макрос остановлен", 48, "Файл отсутствует " Exit Sub End If Open str1 For Input As #2 Do While Not EOF(2) Line Input #2, str1 If (str1 = "") And (EOF(2)) Then Else If (str1 <> "M05") And (str1 <> "M30") Then Print #1, str1 End If End If Loop Close #2 Else str1 = .Cells(i, clnStart).Value
For j = 1 To clnDelt If .Cells(i, clnStart + j).Value <> "" Then str1 = str1 & vbTab & .Cells(i, clnStart + j).Value Else: Exit For End If Next j Print #1, str1 End If End If Next i End With Close #1 End Sub
Хы, а где об этом говорилось раньше? Макрос тупо считывает подряд строки, а скрытые они или нет ему фиолетово. Вот так будет пропускать скрытые строки
[vba]
Код
Option Explicit
Const NOTHYP As String = "В ячейке нет гиперссылки!"
Private Function getHyperlinkAddress(ByVal rCell As Range) As String Dim S As String If rCell.Hyperlinks.Count = 0 Then If Mid$(rCell.Formula, 2, 9) = "HYPERLINK" Then getHyperlinkAddress = Mid$(rCell.Formula, 13, InStr(13, rCell.Formula, Chr(34)) - 13) Else getHyperlinkAddress = NOTHYP End If Else S = rCell.Hyperlinks(1).SubAddress If S <> "" Then S = "#" & rCell.Hyperlinks(1).SubAddress getHyperlinkAddress = rCell.Hyperlinks(rCell.Hyperlinks.Count).Address & S End If End Function
''===
Public Sub main() Dim rowLast As Long, i&, rowStart&, j& Dim clnStart As Byte, clnDelt As Byte Dim str1 As String Const outFile As String = "resultat.nc"
str1 = ThisWorkbook.Path & "/" & outFile Open str1 For Output As #1 With ThisWorkbook.ActiveSheet rowLast = .Cells(Rows.Count, 4).End(xlUp).Row rowStart = 0 clnStart = 4 clnDelt = 4 For i = 1 To 100 If .Cells(i, clnStart).Text = "%" Then rowStart = i Exit For End If Next i If rowStart = 0 Then MsgBox "В первых 100 строках не найдена ячейка, равная %. Макрос остановлен.", 48, "Не найдено" Close #1 Exit Sub
End If For i = 1 To rowLast If .Rows(i).Hidden = False Then str1 = getHyperlinkAddress(.Range(.Cells(i, clnStart).Address))
If str1 <> NOTHYP Then If InStr(str1, ":\") = 0 Then str1 = ThisWorkbook.Path & "/" & str1 End If If Dir(str1) = "" Then Close #1 MsgBox "Не найден файл " & str1 & ". Макрос остановлен", 48, "Файл отсутствует " Exit Sub End If Open str1 For Input As #2 Do While Not EOF(2) Line Input #2, str1 If (str1 = "") And (EOF(2)) Then Else If (str1 <> "M05") And (str1 <> "M30") Then Print #1, str1 End If End If Loop Close #2 Else str1 = .Cells(i, clnStart).Value
For j = 1 To clnDelt If .Cells(i, clnStart + j).Value <> "" Then str1 = str1 & vbTab & .Cells(i, clnStart + j).Value Else: Exit For End If Next j Print #1, str1 End If End If Next i End With Close #1 End Sub
Udik, спасибо огромное, все опробовал в деле - РАБОТАЕТ!
Правда пару непонятных мне косяков все же вылезло: 1. Программа оборудования почему то видет массу ошибок в тексте главной программы. Решилось очень легко: в блокноте удаляю текст программы, копирую этот же текст в эксель, вставляю в блокнот. Работает! Чудеса... Мне кажется причина кроется в скрытых строках...
2. Для облегчения попробовал гиперссылки делать формулой, т.е. используя подстановку через & путь к файлу. При щелчке мышью все работает, открывает, а вот макрос никак не хочет упростить мне жизнь) Ошибка. Пока приходится тысячу раз тыкать, что бы найти нужный путь через обычную гиперссылку. Если есть решение, подскажите, пожалуйста!
Еще раз огромное спасибо!
Udik, спасибо огромное, все опробовал в деле - РАБОТАЕТ!
Правда пару непонятных мне косяков все же вылезло: 1. Программа оборудования почему то видет массу ошибок в тексте главной программы. Решилось очень легко: в блокноте удаляю текст программы, копирую этот же текст в эксель, вставляю в блокнот. Работает! Чудеса... Мне кажется причина кроется в скрытых строках...
2. Для облегчения попробовал гиперссылки делать формулой, т.е. используя подстановку через & путь к файлу. При щелчке мышью все работает, открывает, а вот макрос никак не хочет упростить мне жизнь) Ошибка. Пока приходится тысячу раз тыкать, что бы найти нужный путь через обычную гиперссылку. Если есть решение, подскажите, пожалуйста!
Ага, разобрался. Проблема из-за того, что в формуле ГИПЕРССЫЛКА использовали ссылку а не строку с адресом. В результате функция getHyperlinkAddress возвращала строку типа N14&O14 Подправил.
[vba]
Код
Option Explicit
Const NOTHYP As String = "В ячейке нет гиперссылки!"
Private Function getHyperlinkAddress(ByVal rCell As Range) As String Dim S As String, arr1, i&
If rCell.Hyperlinks.Count = 0 Then If Mid$(rCell.Formula, 2, 9) = "HYPERLINK" Then If Mid(rCell.Formula, 12, 1) = """" Then getHyperlinkAddress = Mid(rCell.Formula, 13, InStr(13, rCell.Formula, Chr(34)) - 13) Else getHyperlinkAddress = Mid(rCell.Formula, 12, InStr(13, rCell.Formula, Chr(34)) - 13) End If If InStr(getHyperlinkAddress, "&") Then arr1 = Split(getHyperlinkAddress, "&") getHyperlinkAddress = "" For i = LBound(arr1) To UBound(arr1) getHyperlinkAddress = getHyperlinkAddress & ActiveSheet.Range(arr1(i)) Next i End If Else getHyperlinkAddress = NOTHYP End If Else S = rCell.Hyperlinks(1).SubAddress If S <> "" Then S = "#" & rCell.Hyperlinks(1).SubAddress getHyperlinkAddress = rCell.Hyperlinks(rCell.Hyperlinks.Count).Address & S End If End Function
''===
Public Sub main() Dim rowLast As Long, i&, rowStart&, j& Dim clnStart As Byte, clnDelt As Byte Dim str1 As String Const outFile As String = "resultat.nc"
str1 = ThisWorkbook.Path & "/" & outFile Open str1 For Output As #1 With ThisWorkbook.ActiveSheet rowLast = .Cells(Rows.Count, 4).End(xlUp).Row rowStart = 0 clnStart = 4 clnDelt = 4 For i = 1 To 100 If .Cells(i, clnStart).Text = "%" Then rowStart = i Exit For End If Next i If rowStart = 0 Then MsgBox "В первых 100 строках не найдена ячейка, равная %. Макрос остановлен.", 48, "Не найдено" Close #1 Exit Sub
End If For i = 1 To rowLast If .Rows(i).Hidden = False Then str1 = getHyperlinkAddress(.Range(.Cells(i, clnStart).Address))
If str1 <> NOTHYP Then If InStr(str1, ":\") = 0 Then str1 = ThisWorkbook.Path & "/" & str1 End If If Dir(str1) = "" Then Close #1 MsgBox "Не найден файл " & str1 & ". Макрос остановлен", 48, "Файл отсутствует " Exit Sub End If Open str1 For Input As #2 Do While Not EOF(2) Line Input #2, str1 If (str1 = "") And (EOF(2)) Then Else If (str1 <> "M05") And (str1 <> "M30") Then Print #1, str1 End If End If Loop Close #2 Else str1 = .Cells(i, clnStart).Value
For j = 1 To clnDelt If .Cells(i, clnStart + j).Value <> "" Then str1 = str1 & vbTab & .Cells(i, clnStart + j).Value Else: Exit For End If Next j Print #1, str1 End If End If Next i End With Close #1 End Sub
[/vba]
Ага, разобрался. Проблема из-за того, что в формуле ГИПЕРССЫЛКА использовали ссылку а не строку с адресом. В результате функция getHyperlinkAddress возвращала строку типа N14&O14 Подправил.
[vba]
Код
Option Explicit
Const NOTHYP As String = "В ячейке нет гиперссылки!"
Private Function getHyperlinkAddress(ByVal rCell As Range) As String Dim S As String, arr1, i&
If rCell.Hyperlinks.Count = 0 Then If Mid$(rCell.Formula, 2, 9) = "HYPERLINK" Then If Mid(rCell.Formula, 12, 1) = """" Then getHyperlinkAddress = Mid(rCell.Formula, 13, InStr(13, rCell.Formula, Chr(34)) - 13) Else getHyperlinkAddress = Mid(rCell.Formula, 12, InStr(13, rCell.Formula, Chr(34)) - 13) End If If InStr(getHyperlinkAddress, "&") Then arr1 = Split(getHyperlinkAddress, "&") getHyperlinkAddress = "" For i = LBound(arr1) To UBound(arr1) getHyperlinkAddress = getHyperlinkAddress & ActiveSheet.Range(arr1(i)) Next i End If Else getHyperlinkAddress = NOTHYP End If Else S = rCell.Hyperlinks(1).SubAddress If S <> "" Then S = "#" & rCell.Hyperlinks(1).SubAddress getHyperlinkAddress = rCell.Hyperlinks(rCell.Hyperlinks.Count).Address & S End If End Function
''===
Public Sub main() Dim rowLast As Long, i&, rowStart&, j& Dim clnStart As Byte, clnDelt As Byte Dim str1 As String Const outFile As String = "resultat.nc"
str1 = ThisWorkbook.Path & "/" & outFile Open str1 For Output As #1 With ThisWorkbook.ActiveSheet rowLast = .Cells(Rows.Count, 4).End(xlUp).Row rowStart = 0 clnStart = 4 clnDelt = 4 For i = 1 To 100 If .Cells(i, clnStart).Text = "%" Then rowStart = i Exit For End If Next i If rowStart = 0 Then MsgBox "В первых 100 строках не найдена ячейка, равная %. Макрос остановлен.", 48, "Не найдено" Close #1 Exit Sub
End If For i = 1 To rowLast If .Rows(i).Hidden = False Then str1 = getHyperlinkAddress(.Range(.Cells(i, clnStart).Address))
If str1 <> NOTHYP Then If InStr(str1, ":\") = 0 Then str1 = ThisWorkbook.Path & "/" & str1 End If If Dir(str1) = "" Then Close #1 MsgBox "Не найден файл " & str1 & ". Макрос остановлен", 48, "Файл отсутствует " Exit Sub End If Open str1 For Input As #2 Do While Not EOF(2) Line Input #2, str1 If (str1 = "") And (EOF(2)) Then Else If (str1 <> "M05") And (str1 <> "M30") Then Print #1, str1 End If End If Loop Close #2 Else str1 = .Cells(i, clnStart).Value
For j = 1 To clnDelt If .Cells(i, clnStart + j).Value <> "" Then str1 = str1 & vbTab & .Cells(i, clnStart + j).Value Else: Exit For End If Next j Print #1, str1 End If End If Next i End With Close #1 End Sub
Отлично! Только опять мелкая несуразица. Любой шаг влево/вправо, макрос не работает. В своем рабочем файле для ячейки с гиперссылкой я прописываю формулу, типа: =ГИПЕРССЫЛКА(O411&O412;O411&O412) В рабочем Вашем примере: =ГИПЕРССЫЛКА(O411&O412;"Попрограмма 1")
В выложенном мной примере, даже не думал, что из-за этого сможет не работать макрос. Для чего я делаю именно так? Что бы глазами пробежать и проверить все пути к подпрограммам, скажем последняя проверка.
Спасибо Вам. С Днем Победы!
Отлично! Только опять мелкая несуразица. Любой шаг влево/вправо, макрос не работает. В своем рабочем файле для ячейки с гиперссылкой я прописываю формулу, типа: =ГИПЕРССЫЛКА(O411&O412;O411&O412) В рабочем Вашем примере: =ГИПЕРССЫЛКА(O411&O412;"Попрограмма 1")
В выложенном мной примере, даже не думал, что из-за этого сможет не работать макрос. Для чего я делаю именно так? Что бы глазами пробежать и проверить все пути к подпрограммам, скажем последняя проверка.
Private Function getHyperlinkAddress(ByVal rCell As Range) As String Dim S As String, arr1, i&
If rCell.Hyperlinks.Count = 0 Then If Mid$(rCell.Formula, 2, 9) = "HYPERLINK" Then If Mid(rCell.Formula, 12, 1) = """" Then getHyperlinkAddress = Mid(rCell.Formula, 13, InStr(13, rCell.Formula, Chr(34)) - 13) Else getHyperlinkAddress = Mid(rCell.Formula, 12, InStr(13, rCell.Formula, Chr(44)) - 12) End If If InStr(getHyperlinkAddress, "&") Then arr1 = Split(getHyperlinkAddress, "&") getHyperlinkAddress = "" For i = LBound(arr1) To UBound(arr1) getHyperlinkAddress = getHyperlinkAddress & ActiveSheet.Range(arr1(i)) Next i End If Else getHyperlinkAddress = NOTHYP End If Else S = rCell.Hyperlinks(1).SubAddress If S <> "" Then S = "#" & rCell.Hyperlinks(1).SubAddress getHyperlinkAddress = rCell.Hyperlinks(rCell.Hyperlinks.Count).Address & S End If End Function
[/vba]
Только запятые не используйте в путях/именах
Подправил функцию [vba]
Код
Private Function getHyperlinkAddress(ByVal rCell As Range) As String Dim S As String, arr1, i&
If rCell.Hyperlinks.Count = 0 Then If Mid$(rCell.Formula, 2, 9) = "HYPERLINK" Then If Mid(rCell.Formula, 12, 1) = """" Then getHyperlinkAddress = Mid(rCell.Formula, 13, InStr(13, rCell.Formula, Chr(34)) - 13) Else getHyperlinkAddress = Mid(rCell.Formula, 12, InStr(13, rCell.Formula, Chr(44)) - 12) End If If InStr(getHyperlinkAddress, "&") Then arr1 = Split(getHyperlinkAddress, "&") getHyperlinkAddress = "" For i = LBound(arr1) To UBound(arr1) getHyperlinkAddress = getHyperlinkAddress & ActiveSheet.Range(arr1(i)) Next i End If Else getHyperlinkAddress = NOTHYP End If Else S = rCell.Hyperlinks(1).SubAddress If S <> "" Then S = "#" & rCell.Hyperlinks(1).SubAddress getHyperlinkAddress = rCell.Hyperlinks(rCell.Hyperlinks.Count).Address & S End If End Function