Показать полную графическую версию : Запрос диалогового окна выбора excel файла
storm_Zcooler
29-08-2012, 11:55
Доброго времени суток!!!
Помогите со скриптом. Есть Excel файл, нужно по нажатию кнопки выходило диалоговое окно выбора excel файла из которого копируется определённый диапазон с данными и вставляется в текущий. Заранее спасибо.
Например, так:
Option Explicit
Sub Sample()
Dim i As Long
Dim objRange As Range
With Application.FileDialog(msoFileDialogOpen)
With .Filters
.Clear
.Add "Microsoft Excel Workbooks", "*.xls"
.Add "All files", "*.*"
End With
.AllowMultiSelect = False
.InitialView = msoFileDialogViewDetails
If Not .Show() = 0 Then
For i = 1 To .SelectedItems.Count
Set objRange = Selection
With Application.Workbooks.Open(.SelectedItems.Item(i))
.Sheets.Item("Лист1").Range("b3:c8").Copy
With ThisWorkbook.Sheets.Item("Лист1")
.Paste objRange
End With
Application.CutCopyMode = False
.Close
End With
Exit For
Next i
End If
End With
End Sub
storm_Zcooler
29-08-2012, 13:49
Спасибо огромное!!!
А можно ли сделать так в том файле из которого импортируется даные есть запись, но там ячейки объеденены, а надо чтобы скопировал эту запись и вставил в другой файл в одну ячейку?
еще вопрос в файле из которого импортируется есть ячейка там указаны размеры например 100Х300Х100 (указаны в см) можно ли при импорте разбить эти данные в три разные ячейки и перевести их в метры.
А можно ли сделать так в том файле из которого импортируется даные есть запись, но там ячейки объеденены, а надо чтобы скопировал эту запись и вставил в другой файл в одну ячейку? »
Поясните приложенными примерами документов с подробными пояснениями.
еще вопрос в файле из которого импортируется есть ячейка там указаны размеры например 100Х300Х100 (указаны в см) можно ли при импорте разбить эти данные в три разные ячейки и перевести их в метры. »
Можно. Точно так же: выложите примеры документов — исходного и результирующего.
storm_Zcooler
30-08-2012, 05:51
Прикладываю два файла исходный и результирующий, ячейки откуда и куда выделены соответствующими цветами.
Примерно так:
Sub Sample2()
Dim objWorksheet As Worksheet
Dim i As Long
Dim elem As Variant
Set objWorksheet = ThisWorkbook.Sheets.Item("Лист1")
With Application.Workbooks.Open("E:\Песочница\0172\исходный.xls")
objWorksheet.Range("A4").Value = .Names.Item("TTNNum").RefersToRange.Value
i = 1
For Each elem In Split(.Sheets.Item("сторона 1").Range("L9").Value, "x")
objWorksheet.Range("F4").Item(1, i).Value = CLng(elem) / 1000
i = i + 1
Next
.Close
End With
Set objWorksheet = Nothing
End Sub
есть запись, но там ячейки объеденены, »
Тут сие роли не играет, поскольку мы просто берём значение из ячейки. Обращаемся к диапазону по имени («TTNNum»).
есть ячейка там указаны размеры например 100Х300Х100 (указаны в см) можно ли при импорте разбить эти данные в три разные ячейки и перевести их в метры. »
Насколько я понимаю — либо размеры в мм (а не в см), либо пример Вы привели неверный. Аналогично — читаем значение ячейки по адресу, разбиваем по символу «x» в массив, затем заполняем целевые ячейки, просто перебирая элементы массива.
storm_Zcooler
31-08-2012, 06:34
Если у меня в исходном файле ячейка называется TTNNum то код получается
objWorksheet.Range("H9").Value = .Names.Item("TTNNum").RefersToRange.Value
а если у меня просто ячейка C9
objWorksheet.Range("H9").Value = .Names.Item("С9").RefersToRange.Value
выдает ошибку....
а если у меня просто ячейка C9 »
.Names — это коллекция имёнованных диапазонов. «C9» — это не именованный диапазон, а адрес ячейки. Смотрите в том же макросе двумя строчками ниже:
… .Sheets.Item("сторона 1").Range("L9").Value …
и делайте так же. Например:
objWorksheet.Range("H9").Value = .Sheets.Item("сторона 1").Range("C9").Value
storm_Zcooler
03-09-2012, 03:38
Спасибо тебе огромное, но у меня еще вопрос, обновил файлы!
В исходном файле есть "вид упаковки"(Pallet #1) это площадка, на ней стоят коробки, количество площадок и количество коробок не постоянное и может меняться. Как сделать цикл так чтобы во первых скопировав одну строку проверял есть ли данные в другой если есть то копировал их.
Во вторых надо сделать чтобы ккопировал данные которые Pallet #1 потом отделял их толстой линией, и потом копивал данные которые Pallet #2 и т.д. соответственно ячейки Размеры грузовых мест и Масса (кг).
storm_Zcooler, изложенное Вами задание мне не понятно. Попробуйте уточнить более детально.
storm_Zcooler
04-09-2012, 05:15
ок. Давайте по порядку.
В исходном файле есть диапазон с9:с17(это коробки), этот диапазон не постоянен может быть больше коробок может быть меньше, этот диапазон определяется объединением ячеек J9(Pallet #1 это площадка на которой размещаются эти коробки). Как можно сделать чтобы копировались данные (коробки которые стоят на площадке Pallet #1) только которые в диапазоне объединения ячеек J9.
наверное опять не понятно сказал =)
storm_Zcooler, использование запятых в предложениях облегчит понимание собеседнику.
storm_Zcooler
04-09-2012, 11:04
Спасибо за помощь закрываем тему там на самом деле всё гораздо сложней чем казалось изначально...
storm_Zcooler
07-09-2012, 11:58
Как сделать в примере, чтобы числа во втором столбце, через запятую, опустились ниже на ячейку, и остальные данные, которые в этой же строке скопировались так же вниз. На примере думаю видно.
storm_Zcooler, примерно так:
Option Explicit
Sub SomeSample()
Dim objRange As Range
Dim i As Long
Dim j As Long
Dim arrValues() As String
With Selection.Cells
For i = .Count To 1 Step -1
With .Item(i)
arrValues = Split(.Value, ",")
For j = UBound(arrValues) To LBound(arrValues) Step -1
.EntireRow.Offset(1).Insert
.Offset(1, 0).Value = arrValues(j)
.Offset(1, -1).Value = .Offset(0, -1).Value
.Offset(1, 1).Value = .Offset(0, 1).Value
.Offset(1, 2).Value = .Offset(0, 2).Value
Next
.EntireRow.Delete
End With
Next
End With
End Sub
Перед исполнением макроса необходимо выделить потребный диапазон со значениями. В Вашем примере это «B2:B4».
А вообще, какое отношение теперешний вопрос имеет к озвученной теме — «Запрос диалогового окна выбора excel файла»?
storm_Zcooler
10-09-2012, 13:31
Приветствую, спасибо за советы но вот задачка немного изменилась, надо чтобы значения после запятой опускались вниз и всё что слева тоже копировались, а справа только в 1 раз оставались. Прикладываю файл там думаю понятней будет.
P.S. у тебя есть яндекс кошелек? Отблагодарю.
а справа только в 1 раз оставались. »
Удалите или закомментируйте ненужные присвоения:
.Offset(XXX, XXX).Value = …
2003: Offset Property [Excel 2003 VBA Language Reference] (http://msdn.microsoft.com/en-us/library/office/aa224911(v=office.11).aspx)
2007: Offset Property (http://msdn.microsoft.com/en-us/library/office/bb213689(v=office.12).aspx)
2010: Offset Property (http://msdn.microsoft.com/en-us/library/office/ff840060.aspx)
Впрочем, никакой разницы по версиям нет. Ну, да ладно.
P.S. у тебя есть яндекс кошелек? »
Нет. Обычного, впрочем, тоже нет.
Отблагодарю. »
Попробуйте обратиться к Администрации, может им сгодится.
storm_Zcooler
11-09-2012, 05:28
а справа только в 1 раз оставались. »
Удалите или закомментируйте ненужные присвоения:
Код:
.Offset(XXX, XXX).Value = … »
Если её удаляю, то значения не будут копироваться вообще, а мне надо только, чтобы в первая строка копировалась полностью, а ниже добавлялись строки со значениями, которые отделяются запятой и всё, что справа было от них, а слева было пусто.
Обновил пример во вложении, может так наглядней будет.
storm_Zcooler, не доглядел с первого раза, не понял до конца Вашей потребности. Приношу Вам свои извинения.
Значит, будет достаточно проверять счётчик и на последнем проходе цикла разбора дублировать и ячейки справа, наподобие:
Option Explicit
Sub SomeSample()
Dim objRange As Range
Dim i As Long
Dim j As Long
Dim arrValues() As String
With Selection.Cells
For i = .Count To 1 Step -1
With .Item(i)
arrValues = Split(.Value, ",")
For j = UBound(arrValues) To LBound(arrValues) Step -1
.EntireRow.Offset(1).Insert
.Offset(1, 0).Value = arrValues(j)
.Offset(1, -4).Value = .Offset(0, -4).Value
.Offset(1, -3).Value = .Offset(0, -3).Value
.Offset(1, -2).Value = .Offset(0, -2).Value
.Offset(1, -1).Value = .Offset(0, -1).Value
If j = LBound(arrValues) Then
.Offset(1, 1).Value = .Offset(0, 1).Value
.Offset(1, 2).Value = .Offset(0, 2).Value
.Offset(1, 3).Value = .Offset(0, 3).Value
.Offset(1, 4).Value = .Offset(0, 4).Value
End If
Next
.EntireRow.Delete
End With
Next
End With
End Sub
Или вовсе на последнем проходе новую строку не добавлять, саму оригинальную строку не удалять, а просто менять значение разбираемой ячейки на последнее значение разбора:
Option Explicit
Sub SomeSample()
Dim objRange As Range
Dim i As Long
Dim j As Long
Dim arrValues() As String
With Selection.Cells
For i = .Count To 1 Step -1
With .Item(i)
arrValues = Split(.Value, ",")
For j = UBound(arrValues) To LBound(arrValues) Step -1
If j = LBound(arrValues) Then
.Value = arrValues(j)
Else
.EntireRow.Offset(1).Insert
.Offset(1, 0).Value = arrValues(j)
.Offset(1, -4).Value = .Offset(0, -4).Value
.Offset(1, -3).Value = .Offset(0, -3).Value
.Offset(1, -2).Value = .Offset(0, -2).Value
.Offset(1, -1).Value = .Offset(0, -1).Value
End If
Next
End With
Next
End With
End Sub
Думаю, так даже лучше будет.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.