#excel
Вопрос:
Я пытаюсь дублировать данные на листе с шагом 12 между каждой ячейкой из листа с 1 ячейкой в строке. Между 12-кратными строками есть другие данные. Это означает, что я не могу перетащить, чтобы расширить формулу. Вот так для номеров клиентов:
'SheetA'E3 = 'SheetB'Y2
'SheetA'E15 = 'SheetB'Y3
'SheetA'E27 = 'SheetB'Y4
..и так далее. Я пробовал расширять 12/24 ячейки за раз и копировать, но не могу заставить это работать. Расширение не добавляет 1 к одному листу, просто 12/ 24 для обоих. Выполнение этого вручную займет месяцы. Можно ли это сделать без решения VBA?
Есть какие-нибудь предложения? Извините, если моя терминология здесь неуместна.
Шита:
Комментарии:
1. Вы можете создавать формулы в новых соседних столбцах целевых листов, формулы, которые используют комбинацию данных с двух листов. В этом случае вы можете просто перетащить формулы вниз и, возможно, выполнить последующую специальную вставку в качестве значений, а затем удалить один столбец. Все еще много работы, но лучше, чем формула для каждого значения. Для чего-то гораздо лучшего требуется VBA, и в данном случае он довольно прямолинеен.
2. @JohnColeman Спасибо, Джон. Мои навыки VBA ужасны, но добавление интервала к исходному листу может быть чем-то, что я мог бы сделать. В любом случае я мог бы убедить разработчиков системы, почему их системе не нужен шаблон Excel с интервалом в 12 строк между каждым новым клиентом.
3. Источник находится в SheetA, а цель-в SheetB ? (или наоборот..)
4. Это похоже на проблему XY. Откуда берутся эти 12 строк данных? Если все ваши данные находятся в таблице с рядом меток на одном конце и 12 столбцами данных в одной строке, то оптимальное решение не будет включать выполнение того, что вы хотите. Пожалуйста, опубликуйте надлежащий образец данных, который можно использовать для репликации вашей проблемы. Кроме того, важна ваша версия Excel (Office 365? Другая версия? Mac против Windows?)
5. SheetA-это шаблон, предназначенный для системного чтения. Он содержит различные параметры, подходящие, в частности, для данной системы. Это 12 повторяющихся строк, поэтому каждый новый системный пользователь считывается каждые 12 строк, а промежуточные строки содержат различные другие параметры для этого пользователя.
Ответ №1:
Попробуйте это (запустите как код VBA):
Sub test1()
For i01 = 0 To 100
Worksheets("SheetA").Cells(3 12 * i01, 5) = Worksheets("SheetB").Cells(2 i01, 25)
Next i01
End Sub
Ответ №2:
Power Query, доступный в Windows Excel 2010 и Office 365, может создать ваш лист с заданным листом. Не уверен в эффекте упомянутой вами изменчивости.
Запрос предполагает, что правильные параметры указаны в качестве заголовков столбцов на листе B. Заголовки столбцов будут скопированы в качестве параметров на лист A.
Чтобы использовать Power Query:
- Выберите какую-нибудь ячейку в таблице данных
Data => Getamp;Transform => from Table/Range
- Когда откроется редактор PQ:
Home => Advanced Editor
- Обратите внимание на название таблицы в строке 2
- Вставьте приведенный ниже код M вместо того, что вы видите
- Измените имя таблицы в строке 2 на то, которое было сгенерировано изначально.
- Прочитайте комментарии и изучите
Applied Steps
, чтобы понять алгоритм
Код M
let
//Read in the data
//Change table name in next line to be the "real" table name
Source = Excel.CurrentWorkbook(){[Name="Table12"]}[Content],
//set data types based on first entry in the column
//will be independent of the column names
typeIt = Table.TransformColumnTypes(Source,
List.Transform(
Table.ColumnNames(Source), each
{_,Value.Type(Table.Column(Source,_){0})})
),
//UNpivot except for the c.number and c.name columns to create the Parameter and Level columns
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(typeIt, {"C. number", "C. name"}, "Parameter", "Level"),
//Group By C.Number
//Add the appropriate rows for each customer
//And a blank row to separate the customers
#"Grouped Rows" = Table.Group(#"Unpivoted Other Columns", {"C. number"}, {
{"All", each _, type table [C. number=nullable number, C. name=nullable text, Parameter=text, Level=any]},
{"custLabel", (t)=> Table.InsertRows(t,0,{
[C. number = null, C. name=null,Parameter = null, Level = null],
[C. number = null, C. name=null, Parameter = "Customer Number", Level="Customer Name"],
[C. number = null, C. name=null,Parameter = t[C. number]{0}, Level = t[C. name]{0}],
[C. number = null, C. name=null,Parameter = "Parameter", Level = "Level"]
})}
}),
//Remove the unneeded columns and expand the remaining table
#"Removed Columns" = Table.RemoveColumns(#"Grouped Rows",{"C. number", "All"}),
#"Expanded custLabel" = Table.ExpandTableColumn(#"Removed Columns", "custLabel", {"Parameter", "Level"}, {"Parameter", "Level"}),
//Remove the top blank row
//promote the new blank row to the Header location
#"Removed Top Rows" = Table.Skip(#"Expanded custLabel",1),
#"Promoted Headers" = Table.PromoteHeaders(#"Removed Top Rows", [PromoteAllScalars=true]),
//data type set to text since it will look better on the report
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Customer Number", type text}, {"Customer Name", type text}})
in
#"Changed Type"```
Ответ №3:
[ Косвенный с помощью строки() ]
Предполагая, что столбец «SheetA» 3 является целевым, а «SheetB» 2-исходными данными.
В SheetA!E3
камеру посадили:
=INDIRECT("SheetB!Y"amp;( ( (row()-3) / 12) 2)
Пресса Enter
Затем выберите SheetA!E3
ячейку, скопируйте. Затем вставьте SheetA!E24
. Формула будет обновляться сама по себе.
Идея :
Найдите связь между номером строки целевой ячейки и номером строки исходной ячейки. [ b > a : 3 >> 2 , 15 >>> 3, 27 >>>> 4 ] приводит к a = (b-3)/12 2 . (Математика похожа на вычисление уравнения прямой линии по 3 координатам.) Затем используйте INDIRECT()
для объединения вычисленного номера строки с адресом столбца.
Комментарии:
1. Я думаю, все наоборот. SheetA — это тупой шаблон, а лист содержит упорядоченные данные.
2. Сделано редактирование в соответствии с разъяснением. Попробуй.. ( ;
3. добавлен 1 дополнительный шаг (часть копирования).