3

У меня есть два списка в колоннах 1 и 2. Мне нужен столбец 3, чтобы иметь формат один тире два.

Например:

Столбец C должен будет повторить все значения A и B.

Я бы предпочел формулу для этого возможно, если нет, то я мог бы использовать VBA. Кроме того, мои данные не так просты, как ABC и 123.

3 ответа3

6

То, что вы ищете, называется « декартово произведение » или "внешнее соединение".

Решение как VBA. Скопируйте следующий код в правую часть редактора Visual Basic. Вы увидите, что ваш макрос теперь имеет название "cartesianproduct": (Источник)

Sub cartesianproduct()
Dim startrange As Range

range1 = Application.InputBox(Prompt:="Please Select First Range", Type:=8)
range2 = Application.InputBox(Prompt:="Please Select Second Range", Type:=8)
Set startrange = Application.InputBox(Prompt:="Please select where you want to put it", Type:=8)

array1 = [range1]
array2 = [range2]

startrange.Select
For i = 1 To UBound(array1)
    For x = 1 To UBound(array2)
        z = z + 1
        ActiveCell.Offset(z, 0).Value = array1(i, 1)
        ActiveCell.Offset(z, 1).Value = array2(x, 1)
    Next
Next
End Sub

Я также нашел здесь решение в виде формулы (не проверено!):

= ЕСЛИ (СТРОКА () - СТРОКА ($ F $ 1)+1> СЧЕТЗ (А: А) * СЧЕТЗ (В: В), "", ИНДЕКС (А: А, INT ((СТРОКА () - СТРОКА ($ F $ 1))/COUNTA (B: B)+1)) & "-" & ИНДЕКС (B: B, MOD (ROW () - ROW ($ F $ 1), COUNTA (B: B))+1))

Я только добавил "-" между обоими значениями ...

2

Вот еще одна формула: введите в C1 и заполните, пока не получите пробелы:

=IFERROR(INDEX(Col_A,INT((ROWS($1:1)-1)/COUNTA(Col_B))+1) & "-" &INDEX(Col_B,MOD(ROWS($1:1)-1,COUNTA(Col_B))+1),"")

Я использовал динамические имена для ссылки на данные столбца; Вы можете изменить это:

Col_A   refers to:  =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A))
Col_B   refers to:  =OFFSET(Sheet1!$B$1,0,0,COUNTA(Sheet1!$B:$B))
1

Так как duDE уже предложил одно решение с VBA, я хотел бы показать другое с Javascript.

Вы можете легко манипулировать Excel, кодируя Javascript с помощью одного инструмента под названием Funfun. Вот основной код:

<script>
var column1 = new Array();
  for(var i=0; i<$internal.column1.length; i++){
   column1[i] = $internal.column1[i]
  };
var column2 = new Array();
  for(var i=0; i<$internal.column2.length; i++){
   column2[i] = $internal.column2[i]
  };
var added = $internal.add;
console.log(added);
var output = new Array();
for(var i=0; i<$internal.column2.length; i++){
   output[i] = column1[i] + added + column2[i];
  };
  console.log(output);
$internal.result = output;

$ internal - это API, предоставляемый Funfun, который помогает вам получить доступ к данным в электронной таблице Excel. Вы можете изменить данные и их площадь в настройках. Ниже приведена настройка этой функции:

{
"add": "=C2",
"column1": "=A2:A9",
"column2": "=B2:B9",
"result": {
    "Type": "Output",
    "Address": "=D2:D9"
}

Одним щелчком мыши все данные и результаты будут загружены в электронную таблицу. Так же, как показано на следующем рисунке: Скриншот

И последнее, но не менее важное: Funfun также предоставляет версию веб-сайта, с помощью которой вы можете более удобно написать свою собственную функцию. Ссылка этой функции

Надеюсь, поможет :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .