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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2010, 13:16   #11
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Поменяйте так:
If FName <> "False" Then
либо уберите тип:
Dim FName

не знаю, дома работало...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 07.09.2010, 13:25   #12
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Поменяйте так:
If FName <> "False" Then
Так, работает, вечером все проверю, отпишусь
valerij вне форума Ответить с цитированием
Старый 07.09.2010, 16:58   #13
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Hugo121
А как сделать, что бы не создавать новую книгу, а копировалось там, где и макрос.
Дело в том, что книга, куда все преобразовывается, имеет др. имя и идет в связке с другой, а так мне придется каждый раз, переименовывать
valerij вне форума Ответить с цитированием
Старый 07.09.2010, 17:08   #14
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Тогда последние 5 строчек кода должны быть такими:
Код:
    With ThisWorkbook.Sheets(1)
        .Range(.Cells(1, 1), .Cells(UBound(a), 4)).Value = a
       .Columns(3).Delete Shift:=xlToLeft
    End With
End Sub
И кстати в версии с новой книгой правильнее так:
Код:
    With Workbooks.Add.Sheets(1)
        .Range(.Cells(1, 1), .Cells(UBound(a), 4)).Value = a
       .Columns(3).Delete Shift:=xlToLeft
    End With
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 07.09.2010 в 17:19.
Hugo121 вне форума Ответить с цитированием
Старый 07.09.2010, 17:37   #15
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Тогда последние 5 строчек кода...
Во, супер!!!
И еще последний ? и перейдем ко второй части, сам не смогу.
Я добавил в конце макроса, код, что бы закрывался автоматом
Код:
Windows("1.xls").Activate
    ActiveWindow.Close
End Sub
Но, имя файла, оригинала, может быть какое угодно, как в голову заводу стукнет...
Нельзя ли, в макросе, не прописывать имя("1.xls")??
valerij вне форума Ответить с цитированием
Старый 07.09.2010, 17:44   #16
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Тогда конец такой (впрочем, Dim можно в начало перенести):
Код:
    With Workbooks.Add.Sheets(1) 'ThisWorkbook.Sheets(1) '
        .Range(.Cells(1, 1), .Cells(UBound(a), 4)).Value = a
       .Columns(3).Delete Shift:=xlToLeft
    End With
    
Dim spth As String
    spth = Dir(FName, vbDirectory)
    Windows(spth).Close

End Sub
Или короче
Код:
Windows(Dir(FName, vbDirectory)).Close
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 07.09.2010, 17:55   #17
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Или короче
Все, отлично!!!
2-я часть ?
У меня часто бывает, что два, разных по имени, файла оригинала и втулить их надо в один, как выше ты сделал, только второй, под первым, в те же столбцы, только через одну, пустую строчку, скрин!
Изображения
Тип файла: jpg 333.jpg (162.0 Кб, 141 просмотров)
valerij вне форума Ответить с цитированием
Старый 07.09.2010, 18:14   #18
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну так тут особо ничего переделывать не надо - ставим открытие и весь код в цикл, а выгрузку не в Cells(1,1), а в Cells(переменная,1). Ну а переменной добавляем в цикле UBound(a).
Сам или я вечером? Сейчас уже убегаю.
Да, а выход из цикла будет и так после отказа открывать очередной файл.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 07.09.2010, 20:09   #19
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Сам или я вечером?
Не получилось, стирается инфа столбца "С", первого оригинала
Код:
Dim otkr As Byte, dov As Long
For otkr = 0 To 1
    FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xls), *.xls")
хххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххх
For i = 1 To UBound(a)
                    If a(i, 4) <> "" Then
                        a(i, 2) = Split(a(i, 2))(5)
                    Else
                        a(i, 2) = 0
                    End If
                Next
                    If otkr = 1 Then
                        dov = UBound(a)
                    Else
                        dov = 0
                    End If
With ThisWorkbook.Sheets(1)
        .Range(.Cells(1 + dov, 1), .Cells(dov + UBound(a), 4)).Value = a
Ваще все не правильно сделал, бред, не въеду, как!

Последний раз редактировалось valerij; 07.09.2010 в 21:37.
valerij вне форума Ответить с цитированием
Старый 07.09.2010, 22:26   #20
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Про "стирается" я забыл сказать - там из-за объединённых ячеек я третий столбец в конце удалял. Надо это дело из цикла вынести в конец.
В общем код такой, на два захода, вставляем в эту книгу (с новой там надо тогда флаг что ли ставить, сложнее будет):
Код:
Option Explicit

Sub importdata()
    Dim FName As String
    Dim x As Range
    Dim i As Long, strow As Long, endrow As Long
    Dim a
    Dim raz As Byte
    Dim dov As Long
    dov = 1
For raz = 0 To 1
    FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xls), *.xls")
    If FName <> "False" Then
        With Workbooks.Open(FName)
            With .Sheets(1)

                Set x = .Cells.Find("Сальдо начальное", lookAt:=xlPart)
                If Not x Is Nothing Then
                    strow = x.Row
                Else
                    Exit Sub
                End If

                Set x = .Cells.Find("Обороты за период", lookAt:=xlPart)
                If Not x Is Nothing Then
                    endrow = x.Row
                Else
                    Exit Sub
                End If

                a = Range(.Cells(strow + 1, 2), .Cells(endrow - 1, 5)).Value
                For i = 1 To UBound(a)
                    If a(i, 4) <> "" Then
                        a(i, 2) = Split(a(i, 2))(5)
                    Else
                        a(i, 2) = 0
                    End If
                Next
            End With
        End With
    Else
        Exit Sub
    End If
    
    With ThisWorkbook.Sheets(1) 'Workbooks.Add.Sheets(1) 'это тут не годится
        .Range(.Cells(dov, 1), .Cells(dov + UBound(a) - 1, 4)).Value = a
      ' .Columns(3).Delete Shift:=xlToLeft'это выносим из цикла
    End With
    dov = dov + UBound(a) + 1
    Windows(Dir(FName, vbDirectory)).Close
Next

       ThisWorkbook.Sheets(1).Columns(3).Delete Shift:=xlToLeft

End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из программы выгружается отчет (плохо), его нужно преобразовать в другой вид (хорошо) Anutik Microsoft Office Excel 4 23.09.2009 11:42
Сохранял один код, а открывается другой fs444 Общие вопросы C/C++ 7 18.08.2009 18:52
переделать один документ в другой Tirendus Microsoft Office Excel 4 16.04.2009 11:59
преобразовать два формата даты в один olimpus Microsoft Office Excel 2 18.09.2008 09:16