Трик на Excel за тази задача

Имам електронна таблица в Excel със следните редове:

       COLUMN
Value1.Value2.Value3
Value4.Value5.Value6
Value7.Value8.Value9

В друга електронна таблица имам прост списък с имена:

   COLUMN
    Name1
    Name2
    Name3

И, разбира се, този списък е огромен :).

Така че трябва да имате следната електронна таблица в края:

       COLUMN

Value1.Name1.Value2.Value3
Value4.Name1.Value5.Value6
Value7.Name1.Value8.Value9
Value1.Name2.Value2.Value3
Value4.Name2.Value5.Value6
Value7.Name2.Value8.Value9
Value1.Name3.Value2.Value3
Value4.Name4.Value5.Value6
Value7.Name4.Value8.Value9

Трябва да свържа имената в списъка с всички стойности в електронната таблица, като ги репликирам за ВСИЧКИ имена.

Има ли начин този процес да се извърши автоматично? Ръчният процес ще отнеме часове и мисля, че има по-умен начин да го направите, въпреки че не го знам! :)

Благодаря ви предварително за помощта.


person D. Caan    schedule 24.02.2014    source източник
comment
1) Трябва ли да добавяте NameI винаги след първото . в value колона? 2) Има ли дубликати в Name колона 3) трябва ли да е VBA решение или формула?   -  person Dmitry Pavliv    schedule 24.02.2014
comment
@simoco 1) Да. 2) Няма дубликати в колоната „Име“.   -  person D. Caan    schedule 24.02.2014
comment
3) трябва ли да бъде VBA решение или формула?   -  person Dmitry Pavliv    schedule 24.02.2014
comment
Далек, всичките ти стойности в колона Values валидни ли са? Имам предвид винаги ли имат .?   -  person Dmitry Pavliv    schedule 24.02.2014
comment
Винаги има . между стойностите. стойностите се променят, но винаги има . между тях.   -  person D. Caan    schedule 24.02.2014


Отговори (3)


Винаги има "." между стойностите.

Опитайте този код. Използването на масиви би било много по-бързо за огромен списък от имена/стойности:

Sub test()
    Dim arrVal As Variant
    Dim arrNames As Variant
    Dim arrRes As Variant
    Dim v, n, k As Long

    'change Sheet1 to suit
    With ThisWorkbook.Worksheets("Sheet1")
        'change A1:A3 to values address
        arrVal = .Range("A1:A3")
        'change B1:B3 to names address
        arrNames = .Range("B1:B3")

        ReDim arrRes(1 To UBound(arrVal) * UBound(arrNames), 1 To 1)
        k = 1
        For Each v In arrVal
            For Each n In arrNames
                arrRes(k, 1) = Left(v, InStr(1, v, ".")) & n & Mid(v, InStr(1, v, "."))
                k = k + 1
            Next
        Next v

        'change "c1" to start cell where to put new values
        .Range("C1").Resize(UBound(arrRes, 1)) = arrRes
    End With
End Sub

Забележка: Ако не знаете точните адреси на диапазоните „стойности“ и „име“, променете тази част

'change A1:A3 to values address
arrVal = .Range("A1:A3")
'change B1:B3 to names address
arrNames = .Range("B1:B3")

to

'change A1:A to "values" address
arrVal = .Range("A1:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)
'change B1:B to "names" address
arrNames = .Range("B1:B" & .Cells(.Rows.Count, "B").End(xlUp).Row)

В този случай диапазоните „стойности“ и „име“ започват съответно от A1 и B1 и завършват в последния непразен ред в колони A и B съответно.

Резултат:

въведете описание на изображението тук

person Dmitry Pavliv    schedule 24.02.2014
comment
Не знам дали съм направил нещо нередно, но ми дава грешката Type mismatch на .Range(C1).Resize(UBound(arrRes)) = WorksheetFunction.Transpose(arrRes) - person D. Caan; 24.02.2014
comment
както следва от коментарите към вашето Q, този код приема, че всички стойности в масива arrVal = .Range("A1:A3") имат .. Вярно ли е? може би сте включили заглавки на колони в адреса на стойностния диапазон? - person Dmitry Pavliv; 24.02.2014
comment
Те имат .. Няма заглавка. - person D. Caan; 24.02.2014
comment
@Dalek, имаше някои ограничения с функцията за транспониране (ограничение за дължина на масива). Актуализирах отговора си - сега трябва да работи - person Dmitry Pavliv; 24.02.2014

И е добро предизвикателство да го направиш с формули: :)

въведете описание на изображението тук

С тази формула за масив в D1 и след това копирайте надолу

=INDEX(LEFT($A$1:$A$4;FIND(".";$A$1:$A$4))&TRANSPOSE($C$1:$C$3)&RIGHT($A$1:$A$4;LEN($A$1:$A$4)-FIND(".";$A$1:$A$4)+1);1+INT((ROWS($D$1:D1)-1)/ROWS($C$1:$C$3));1+MOD(ROWS($D$1:D1)-1;ROWS($C$1:$C$3)))

В зависимост от вашите регионални настройки може да се наложи да замените разделителя на полето ";" от ","

person CRondao    schedule 24.02.2014
comment
Като човек, който се отдръпва от предизвикателства като Excel Hero Formula Challenges, все пак трябва да кажа, че това е сериозен бонбон за окото. +1! - person NullDev; 24.02.2014
comment
Копирането не ми върши работа. За първия ред всичко е наред. Някаква специална конфигурация за това? - person D. Caan; 25.02.2014
comment

Това се дължи на правописната грешка в имената на променливите тук:

print_r($google_ouath);//give error Undefined variable: google_ouath
print_r($google_ouath->userinfo); //give error Undefined variable: google_ouath
print_r($google_ouath->userinfo>get());//give error Undefined variable: google_ouath

Името на променлива google_ouath трябва да бъде google_oauth, т.е. a и u трябва да се сменят, така че става:

print_r($google_oauth);
print_r($google_oauth->userinfo);
print_r($google_oauth->userinfo>get());

Трябва също така да се отървете от остарелите имена с дълъг обхват:

$client->setScopes(array('https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/userinfo.profile'));

и използвайте съкратена и съвместима с OpenID Connect форма:

$client->setScopes(array('email', 'profile'));
- person CRondao; 25.02.2014

Мисля, че това може да свърши работа.

    Const FIRST_TALBE = 4
    Const SECOND_TABLE = 2

    Sub makeTheJob()
        For i = 1 To lastRow
            l = Split(Cells(i, FIRST_TABLE), ".")
            newvalue = l(0) & "." & Cells(i, SECOND_TABLE) & "." & l(1) & "." & l(2)
            Debug.Print newvalue
        Next i
    End Sub
person Makah    schedule 24.02.2014