В папке с файлом эксель лежат несколько пронумерованных файлов jpg. Как макросом - расставить их по вертикали (в соответствии с номерами файлов - по возрастанию) - на лист, начиная от ячейки C3 ?
Доброе утро, форумчане. Помогите решить проблему.
В папке с файлом эксель лежат несколько пронумерованных файлов jpg. Как макросом - расставить их по вертикали (в соответствии с номерами файлов - по возрастанию) - на лист, начиная от ячейки C3 ?perven
perven, Сортировка, наверное, слабовата))) Но примерно можно так (Это с расчётом, что все файлы jpg и с именем-цифрой): [vba]
Код
Sub InterToVertiKal() Dim sPath As String Dim FSO, pic Dim sInfo() As String, k As Long Dim r As Range, offsetLeight As Integer, h As Double sPath = ThisWorkbook.Path Set FSO = CreateObject("Scripting.FileSystemObject") Set r = Cells(4, 3) ReDim sInfo(2, 1) offsetLeight = 13 'отвечает за высоту рисунка. Если тут 13, то высота рисунка будет в 14 ячеек With FSO With .GetFolder(sPath) If .Files.Count = 0 Then MsgBox "Файлов в в папке с книгой не найдено", 48 Exit Sub End If For Each fl In .Files If fl.Type = "Файл ""JPG""" Then k = k + 1 ReDim Preserve sInfo(2, k) sInfo(1, k) = Left(fl.ShortName, Len(fl.ShortName) - Len(".jpg")) sInfo(2, k) = fl.Path End If Next fl End With Call Sortir(sInfo) For i = 1 To UBound(sInfo, 2) h = Range(r, r.Offset(offsetLeight)).Height r.Select Set pic = ActiveSheet.Pictures.Insert(sInfo(2, i)) ' pic.Width = pic.Height / h pic.Height = h Set r = r.Offset(offsetLeight + 1) Next i End With End Sub Function Sortir(ByRef m As Variant) As Variant Dim t1 As String, t2 As String Dim leight As Long leight = UBound(m, 2) For i = 1 To leight For j = i To leight If CLng(m(1, i)) > CLng(m(1, j)) Then s1 = m(1, i) s2 = m(2, i) m(1, i) = m(1, j) m(2, i) = m(2, j) m(1, j) = s1 m(2, j) = s2 j = i End If Next j Next i End Function
[/vba]
perven, Сортировка, наверное, слабовата))) Но примерно можно так (Это с расчётом, что все файлы jpg и с именем-цифрой): [vba]
Код
Sub InterToVertiKal() Dim sPath As String Dim FSO, pic Dim sInfo() As String, k As Long Dim r As Range, offsetLeight As Integer, h As Double sPath = ThisWorkbook.Path Set FSO = CreateObject("Scripting.FileSystemObject") Set r = Cells(4, 3) ReDim sInfo(2, 1) offsetLeight = 13 'отвечает за высоту рисунка. Если тут 13, то высота рисунка будет в 14 ячеек With FSO With .GetFolder(sPath) If .Files.Count = 0 Then MsgBox "Файлов в в папке с книгой не найдено", 48 Exit Sub End If For Each fl In .Files If fl.Type = "Файл ""JPG""" Then k = k + 1 ReDim Preserve sInfo(2, k) sInfo(1, k) = Left(fl.ShortName, Len(fl.ShortName) - Len(".jpg")) sInfo(2, k) = fl.Path End If Next fl End With Call Sortir(sInfo) For i = 1 To UBound(sInfo, 2) h = Range(r, r.Offset(offsetLeight)).Height r.Select Set pic = ActiveSheet.Pictures.Insert(sInfo(2, i)) ' pic.Width = pic.Height / h pic.Height = h Set r = r.Offset(offsetLeight + 1) Next i End With End Sub Function Sortir(ByRef m As Variant) As Variant Dim t1 As String, t2 As String Dim leight As Long leight = UBound(m, 2) For i = 1 To leight For j = i To leight If CLng(m(1, i)) > CLng(m(1, j)) Then s1 = m(1, i) s2 = m(2, i) m(1, i) = m(1, j) m(2, i) = m(2, j) m(1, j) = s1 m(2, j) = s2 j = i End If Next j Next i End Function
perven, Скажите, пожалуйста, а на какой строчке ошибка, если дебаг нажать? Судя по всему неверные данные получает код... У вас все файлы jpg и имя имеют цифрой? ещё попробуйте такой макрос (но функцию сортировки оставьте прежней): [vba]
Код
Sub InterToVertiKal() Dim sPath As String Dim FSO, pic Dim sInfo() As String, k As Long Dim r As Range, offsetLeight As Integer, h As Double sPath = ThisWorkbook.Path Set FSO = CreateObject("Scripting.FileSystemObject") Set r = Cells(4, 3) ReDim sInfo(2, 1) offsetLeight = 13 'отвечает за высоту рисунка. Если тут 13, то высота рисунка будет в 14 ячеек With FSO With .GetFolder(sPath) If .Files.Count = 0 Then MsgBox "Файлов в в папке с книгой не найдено", 48 Exit Sub End If For Each fl In .Files If fl.Type = "Файл ""JPG""" Then k = k + 1 ReDim Preserve sInfo(2, k) sInfo(1, k) = Left(fl.ShortName, Len(fl.ShortName) - Len(".jpg")) sInfo(2, k) = fl.Path End If Next fl End With Call Sortir(sInfo) For i = 1 To UBound(sInfo, 2) h = Range(r, r.Offset(offsetLeight)).Height r.Select Set pic = r.Parent.Shapes.AddPicture(sInfo(2, i), False, True, r.Left, r.Top, -1, -1) ' Set pic = r.Parent.Pictures.Insert(sInfo(2, i)) ' pic.Width = pic.Height / h pic.Height = h Set r = r.Offset(offsetLeight + 1) Next i End With End Sub
[/vba]
perven, Скажите, пожалуйста, а на какой строчке ошибка, если дебаг нажать? Судя по всему неверные данные получает код... У вас все файлы jpg и имя имеют цифрой? ещё попробуйте такой макрос (но функцию сортировки оставьте прежней): [vba]
Код
Sub InterToVertiKal() Dim sPath As String Dim FSO, pic Dim sInfo() As String, k As Long Dim r As Range, offsetLeight As Integer, h As Double sPath = ThisWorkbook.Path Set FSO = CreateObject("Scripting.FileSystemObject") Set r = Cells(4, 3) ReDim sInfo(2, 1) offsetLeight = 13 'отвечает за высоту рисунка. Если тут 13, то высота рисунка будет в 14 ячеек With FSO With .GetFolder(sPath) If .Files.Count = 0 Then MsgBox "Файлов в в папке с книгой не найдено", 48 Exit Sub End If For Each fl In .Files If fl.Type = "Файл ""JPG""" Then k = k + 1 ReDim Preserve sInfo(2, k) sInfo(1, k) = Left(fl.ShortName, Len(fl.ShortName) - Len(".jpg")) sInfo(2, k) = fl.Path End If Next fl End With Call Sortir(sInfo) For i = 1 To UBound(sInfo, 2) h = Range(r, r.Offset(offsetLeight)).Height r.Select Set pic = r.Parent.Shapes.AddPicture(sInfo(2, i), False, True, r.Left, r.Top, -1, -1) ' Set pic = r.Parent.Pictures.Insert(sInfo(2, i)) ' pic.Width = pic.Height / h pic.Height = h Set r = r.Offset(offsetLeight + 1) Next i End With End Sub
perven, Тогда попробуйте поместить файлы jpg в одну папку с файлом - экселем. Немного подкорректировал, на случай отсутствия файлов в том же каталоге, что и книга (и отсёк картинки с нечисловыми именами).
[vba]
Код
Sub InterToVertiKal() Dim sPath As String Dim FSO, pic Dim sInfo() As String, k As Long Dim r As Range, offsetLeight As Integer, h As Double Dim flgControl As Boolean Dim namefl As String sPath = ThisWorkbook.Path Set FSO = CreateObject("Scripting.FileSystemObject") Set r = Cells(4, 3) ReDim sInfo(2, 1)
offsetLeight = 13 'отвечает за высоту рисунка. Если тут 13, то высота рисунка будет в 14 ячеек With FSO With .GetFolder(sPath) If .Files.Count = 0 Then MsgBox "Файлов в папке с книгой не найдено", 48 Exit Sub End If For Each fl In .Files If fl.Type = "Файл ""JPG""" Then namefl = Left(fl.ShortName, Len(fl.ShortName) - Len(".jpg")) If IsNumeric(namefl) Then k = k + 1 ReDim Preserve sInfo(2, k) sInfo(1, k) = namefl sInfo(2, k) = fl.Path End If End If Next fl End With If k > 0 Then Call Sortir(sInfo) For i = 1 To UBound(sInfo, 2) h = Range(r, r.Offset(offsetLeight)).Height r.Select Set pic = r.Parent.Shapes.AddPicture(sInfo(2, i), False, True, r.Left, r.Top, -1, -1) ' Set pic = r.Parent.Pictures.Insert(sInfo(2, i)) ' pic.Width = pic.Height / h pic.Height = h Set r = r.Offset(offsetLeight + 1) Next i Else MsgBox "Файлов формата " & """JPG""" & " в папке с книгой не найдено", 48 End If End With End Sub Function Sortir(ByRef m As Variant) As Variant Dim t1 As String, t2 As String Dim leight As Long leight = UBound(m, 2) For i = 1 To leight For j = i To leight If CLng(m(1, i)) > CLng(m(1, j)) Then s1 = m(1, i) s2 = m(2, i) m(1, i) = m(1, j) m(2, i) = m(2, j) m(1, j) = s1 m(2, j) = s2 j = i End If Next j Next i End Function
[/vba]
perven, Тогда попробуйте поместить файлы jpg в одну папку с файлом - экселем. Немного подкорректировал, на случай отсутствия файлов в том же каталоге, что и книга (и отсёк картинки с нечисловыми именами).
[vba]
Код
Sub InterToVertiKal() Dim sPath As String Dim FSO, pic Dim sInfo() As String, k As Long Dim r As Range, offsetLeight As Integer, h As Double Dim flgControl As Boolean Dim namefl As String sPath = ThisWorkbook.Path Set FSO = CreateObject("Scripting.FileSystemObject") Set r = Cells(4, 3) ReDim sInfo(2, 1)
offsetLeight = 13 'отвечает за высоту рисунка. Если тут 13, то высота рисунка будет в 14 ячеек With FSO With .GetFolder(sPath) If .Files.Count = 0 Then MsgBox "Файлов в папке с книгой не найдено", 48 Exit Sub End If For Each fl In .Files If fl.Type = "Файл ""JPG""" Then namefl = Left(fl.ShortName, Len(fl.ShortName) - Len(".jpg")) If IsNumeric(namefl) Then k = k + 1 ReDim Preserve sInfo(2, k) sInfo(1, k) = namefl sInfo(2, k) = fl.Path End If End If Next fl End With If k > 0 Then Call Sortir(sInfo) For i = 1 To UBound(sInfo, 2) h = Range(r, r.Offset(offsetLeight)).Height r.Select Set pic = r.Parent.Shapes.AddPicture(sInfo(2, i), False, True, r.Left, r.Top, -1, -1) ' Set pic = r.Parent.Pictures.Insert(sInfo(2, i)) ' pic.Width = pic.Height / h pic.Height = h Set r = r.Offset(offsetLeight + 1) Next i Else MsgBox "Файлов формата " & """JPG""" & " в папке с книгой не найдено", 48 End If End With End Sub Function Sortir(ByRef m As Variant) As Variant Dim t1 As String, t2 As String Dim leight As Long leight = UBound(m, 2) For i = 1 To leight For j = i To leight If CLng(m(1, i)) > CLng(m(1, j)) Then s1 = m(1, i) s2 = m(2, i) m(1, i) = m(1, j) m(2, i) = m(2, j) m(1, j) = s1 m(2, j) = s2 j = i End If Next j Next i End Function
perven, Хорошо, запустите, пожалуйста Следующий макрос: [vba]
Код
Sub InterToVertiKal() Dim sPath As String Dim FSO Dim s$ sPath = ThisWorkbook.Path Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO With .GetFolder(sPath) If .Files.Count = 0 Then MsgBox "Файлов в папке с книгой не найдено", 48 Exit Sub End If For Each fl In .Files s = s & Chr(13) & fl.Type Next fl Debug.Print s End With End With End Sub
[/vba] у меня подозрения, что тип может иначе отображаться... что-то в МДСНе не нашёл информации... После отработанного макроса в окне Immediate должна отобразиться информация о типе отображаемых в папке книги файлов. Скопируйте, пожалуйста, сюда эту информацию.
perven, Хорошо, запустите, пожалуйста Следующий макрос: [vba]
Код
Sub InterToVertiKal() Dim sPath As String Dim FSO Dim s$ sPath = ThisWorkbook.Path Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO With .GetFolder(sPath) If .Files.Count = 0 Then MsgBox "Файлов в папке с книгой не найдено", 48 Exit Sub End If For Each fl In .Files s = s & Chr(13) & fl.Type Next fl Debug.Print s End With End With End Sub
[/vba] у меня подозрения, что тип может иначе отображаться... что-то в МДСНе не нашёл информации... После отработанного макроса в окне Immediate должна отобразиться информация о типе отображаемых в папке книги файлов. Скопируйте, пожалуйста, сюда эту информацию.Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Воскресенье, 29.10.2017, 09:58
perven, у меня эксель 2013х64 дома тоже... работает отлично. Последний макрос должен был написать в окно Immediate кой-чего, что я Вас попросил сюда скопировать) Нажимаем Alt+F11.Появляется окно ВБА. если тут нет у Вас окошечка Immediate, зайдите в View, там включите отображение Immediate window.
perven, у меня эксель 2013х64 дома тоже... работает отлично. Последний макрос должен был написать в окно Immediate кой-чего, что я Вас попросил сюда скопировать) Нажимаем Alt+F11.Появляется окно ВБА. если тут нет у Вас окошечка Immediate, зайдите в View, там включите отображение Immediate window.Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Воскресенье, 29.10.2017, 10:22
perven, Как я и думал, наверное, от операционной системы зависит Попробуйте так:
[vba]
Код
Sub InterToVertiKal_2() Dim sPath As String Dim FSO, pic Dim a1 As Variant Dim sInfo() As String, k As Long Dim r As Range, offsetLeight As Integer, h As Double Dim flgControl As Boolean Dim namefl As String Dim Type_ As String, ShortName_ As String sPath = ThisWorkbook.Path Set FSO = CreateObject("Scripting.FileSystemObject") Set r = Cells(4, 3) ReDim sInfo(2, 1)
offsetLeight = 13 'отвечает за высоту рисунка. Если тут 13, то высота рисунка будет в 14 ячеек With FSO With .GetFolder(sPath) If .Files.Count = 0 Then MsgBox "Файлов в папке с книгой не найдено", 48 Exit Sub End If For Each fl In .Files ShortName_ = fl.ShortName Type_ = UCase(Right(ShortName_, Len(ShortName_) - InStrRev(ShortName_, "."))) If Type_ = "JPG" Or Type_ = "JPEG" Then namefl = Left(ShortName_, Len(ShortName_) - (Len(Type_) + 1)) If IsNumeric(namefl) Then k = k + 1 ReDim Preserve sInfo(2, k) sInfo(1, k) = namefl sInfo(2, k) = fl.Path End If End If Next fl End With If k > 0 Then Call Sortir(sInfo) For i = 1 To UBound(sInfo, 2) h = Range(r, r.Offset(offsetLeight)).Height r.Select Set pic = r.Parent.Shapes.AddPicture(sInfo(2, i), False, True, r.Left, r.Top, -1, -1) ' Set pic = r.Parent.Pictures.Insert(sInfo(2, i)) ' pic.Width = pic.Height / h pic.Height = h Set r = r.Offset(offsetLeight + 1) Next i Else MsgBox "Файлов формата " & """JPG""" & " в папке с книгой не найдено", 48 End If End With End Sub Function Sortir(ByRef m As Variant) As Variant Dim t1 As String, t2 As String Dim leight As Long leight = UBound(m, 2) For i = 1 To leight For j = i To leight If CLng(m(1, i)) > CLng(m(1, j)) Then s1 = m(1, i) s2 = m(2, i) m(1, i) = m(1, j) m(2, i) = m(2, j) m(1, j) = s1 m(2, j) = s2 j = i End If Next j Next i End Function
[/vba]
perven, Как я и думал, наверное, от операционной системы зависит Попробуйте так:
[vba]
Код
Sub InterToVertiKal_2() Dim sPath As String Dim FSO, pic Dim a1 As Variant Dim sInfo() As String, k As Long Dim r As Range, offsetLeight As Integer, h As Double Dim flgControl As Boolean Dim namefl As String Dim Type_ As String, ShortName_ As String sPath = ThisWorkbook.Path Set FSO = CreateObject("Scripting.FileSystemObject") Set r = Cells(4, 3) ReDim sInfo(2, 1)
offsetLeight = 13 'отвечает за высоту рисунка. Если тут 13, то высота рисунка будет в 14 ячеек With FSO With .GetFolder(sPath) If .Files.Count = 0 Then MsgBox "Файлов в папке с книгой не найдено", 48 Exit Sub End If For Each fl In .Files ShortName_ = fl.ShortName Type_ = UCase(Right(ShortName_, Len(ShortName_) - InStrRev(ShortName_, "."))) If Type_ = "JPG" Or Type_ = "JPEG" Then namefl = Left(ShortName_, Len(ShortName_) - (Len(Type_) + 1)) If IsNumeric(namefl) Then k = k + 1 ReDim Preserve sInfo(2, k) sInfo(1, k) = namefl sInfo(2, k) = fl.Path End If End If Next fl End With If k > 0 Then Call Sortir(sInfo) For i = 1 To UBound(sInfo, 2) h = Range(r, r.Offset(offsetLeight)).Height r.Select Set pic = r.Parent.Shapes.AddPicture(sInfo(2, i), False, True, r.Left, r.Top, -1, -1) ' Set pic = r.Parent.Pictures.Insert(sInfo(2, i)) ' pic.Width = pic.Height / h pic.Height = h Set r = r.Offset(offsetLeight + 1) Next i Else MsgBox "Файлов формата " & """JPG""" & " в папке с книгой не найдено", 48 End If End With End Sub Function Sortir(ByRef m As Variant) As Variant Dim t1 As String, t2 As String Dim leight As Long leight = UBound(m, 2) For i = 1 To leight For j = i To leight If CLng(m(1, i)) > CLng(m(1, j)) Then s1 = m(1, i) s2 = m(2, i) m(1, i) = m(1, j) m(2, i) = m(2, j) m(1, j) = s1 m(2, j) = s2 j = i End If Next j Next i End Function