Centrum Skryptów - Microsoft Office

Jak wyciąć wiersz z jednego arkusza kalkulacyjnego programu Excel i wkleić go do innego arkusza kalkulacyjnego?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak wyciąć wiersz z jednego arkusza kalkulacyjnego programu Excel i wkleić go do innego arkusza kalkulacyjnego?

Cześć, Skrypciarze! Jak wyciąć wiersz z arkusza kalkulacyjnego programu Excel i wkleić go do pierwszego nieużywanego wiersza w innym arkuszu kalkulacyjnym Excel?

-- NC

Cześć, NC. Wyglądaliście dzisiaj może przez okno? Jeszcze niedawno, a mianowicie wczoraj, świeciło piękne słoneczko i świat wydawał się taki piękny, a dzisiaj znowu jest ponuro i okropnie. Nie wiem, jak ja sobie poradzę ze zmianami pogodowymi w tym roku, ale przecież nie może być tak, że w jednym tygodniu pada śniegi i wszystko zaczyna wyglądać przepięknie, ludzie czują, że zbliżają się święta, a potem nagle wszystko topnieje, robi się szaro, zaczyna padać, jest pochmurno i ciemno przez cały dzień. Wtedy odechciewa się człowiekowi w ogóle z domu wychodzić. Ale niestety w naszej firmie nie ma zwolnień z okazji paskudnej pogody, więc do pracy iść trzeba. Można za to tak kombinować, żeby nie było potrzeby wyjścia na zewnątrz przez cały dzień. Wystarczy w sumie zaopatrzyć się w zapas pączków i drożdżówek na cały dzień, podkręcić kaloryfer (w pracy nie wypada owijać się ciepłym kocem – ktoś mógłby to źle zinterpretować) i czekać, aż znowu wyjdzie słonko.

Skoro więc nie ma żadnej zachęty ani konkretnego powodu, żeby wychodzić z biura, może zabiorę się za napisanie skryptu, dzięki któremu można wyciąć wiersz z jednego arkusza kalkulacyjnego programu Excel i wkleić go do innego arkusza kalkulacyjnego. Mniej-więcej takiego:

Const xlDown = -4121



'Open first spreadsheet

Set objOldExcel = CreateObject("Excel.Application")

objOldExcel.Visible = True



Set objOldWorkbook = objOldExcel.Workbooks.Open("C:\Scripts\OldTest.xls")

Set objOldWorksheet = objOldWorkbook.Worksheets("Sheet1")



'Open second spreadsheet

Set objNewExcel = CreateObject("Excel.Application")

objNewExcel.Visible = True



Set objNewWorkbook = objNewExcel.Workbooks.Open("C:\Scripts\NewTest.xls")

Set objNewWorksheet = objNewWorkbook.Worksheets("Sheet1")



'Cut row from the original spreadsheet

Set objOldRange = objOldWorksheet.Range("A1").EntireRow

objOldRange.Cut



'Find the first unused row in the second spreadsheet



Set objNewRange = objNewExcel.Range("A1")

objNewRange.End(xlDown).Activate

intNewRow = objNewExcel.ActiveCell.Row + 1

strNewCell = "A" &  intNewRow

objNewExcel.Range(strNewCell).Activate



'Paste the data into the second spreadsheet

objNewWorksheet.Paste



'Delete the row from the original spreadsheet

objOldRange.Delete

OK, przyznaję. Ten skrypt jest trochę bardziej skomplikowany, niż powinien. Ale nie martwcie się; zobaczę, co da się zrobić, żeby go wyjaśnić w sposób zrozumiały. Ponieważ największą trudność może sprawiać zapamiętanie, z którym arkuszem kalkulacyjnym aktualnie pracujemy, zrobiłem coś radykalnego, całkowicie niespotykanego w rubryce Cześć Skrypciarze!: dodałem do kodu kilka komentarzy, które, mam nadzieję, pomogą Wam w odróżnieniu różnych części skryptów.

Uwaga. Słucham? Dlaczego po prostu nie oznaczymy skryptu kolorem? Rety, Wy chyba nie mieliście do czynienia z dozwolonymi szablonami strony sieci Web, nieprawdaż? Od ponad trzech lat staramy się o możliwość wykorzystania pogrubionej czcionki w naszych przykładowych skryptach. Kolory to coś, o czym możemy tylko pomarzyć.

Na początek określamy stałą o nazwie xlDown i przypisujemy jej wartość -4121; zastosujemy ją do znalezienia pierwszego nieużywanego wiersza w drugim arkuszu. Następnie użyjemy fragmentu kodu w celu:

  1. Utworzenia wystąpienia obiektu Excel.Application.
  2. Nadania właściwości Visible wartości True
  3. Otwarcia pliku C:\Scripts\OldTest.xls i połączenia się z pierwszym arkuszem w tym pliku.

A oto nasz fragment kodu:

Set objOldExcel = CreateObject("Excel.Application")

objOldExcel.Visible = True



Set objOldWorkbook = objOldExcel.Workbooks.Open("C:\Scripts\OldTest.xls")

Set objOldWorksheet = objOldWorkbook.Worksheets("Sheet1")

Nieźle, nie? Teraz powtórzymy ten proces, tym razem otwierając arkusz kalkulacyjny o nazwie NewTest.xls i łącząc się z pierwszym arkuszem w tym pliku:

Set objNewExcel = CreateObject("Excel.Application")

objNewExcel.Visible = True



Set objNewWorkbook = objNewExcel.Workbooks.Open("C:\Scripts\NewTest.xls")

Set objNewWorksheet = objNewWorkbook.Worksheets("Sheet1")

Jeżeli uważaliści, wiecie, że mamy teraz uruchomione dwa wystąpienia programu Excel, widoczne na ekranie; jedno wystąpienie używa odniesienia do obiektu objOldExcel, a drugie odniesienia do obiektu objNewExcel. Jasne? To dobrze. Połowę drogi mamy już za sobą.

Teraz musimy wyciąć pierwszy wiersz z pliku OldTest.xls, arkusza kalkulacyjnego, do którego odnosi się odniesienie objOldExcel. Oto, jak to robimy:

Set objOldRange = objOldWorksheet.Range("A1").EntireRow

objOldRange.Cut

Teraz, kiedy na to patrzę, nie wydaje mi się to wcale takie trudne. (Naprawdę?) W pierwszym wierszu tworzymy po prostu wystąpienie obiektu Range programu Excel. A ponieważ chcemy, aby ten zakres obejmował wiersz 1, zaczynamy w komórce A1, a następnie dołączamy całą właściwość EntireRow żeby się upewnić, że wszystkie komórki w tym wierszu zostaną ujęte w tym zakresie.

Następnie, w wierszu drugim, wywołujemy metodę Cut w tym zakresie, w celu wycięcia pierwszego wiersza z tego arkusza kalkulacyjnego. Jak się okazuje, metoda Cut działa raczej jak metoda Copy: kopiuje informacje do Schowka, jak można się było spodziewać. Nie usuwa jednak tej informacji z oryginalnego arkusza kalkulacyjnego. Innymi słowy, mamy wiersz 1 w Schowku, tak jak chcieliśmy. Nie usunęliśmy go jednak z pierwszego pliku. Czy kiedyś w końcu będzie całkowicie po naszemu?

Ale nie martwcie się: nie mam wpływu na pogodę, ale mogę (i tak właśnie zrobię) pokazać Wam sposób poradzenia sobie z problemem nieusuwania zawartości prze tę metodę.

Teraz zajmijmy się następującym fragmentem kodu:

Set objNewRange = objNewExcel.Range("A1")

objNewRange.End(xlDown).Activate

intNewRow = objNewExcel.ActiveCell.Row + 1

strNewCell = "A" &  intNewRow

objNewExcel.Range(strNewCell).Activate

Ten fragment kodu umożliwia nam zlokalizowanie pierwszego nieużywanego wiersza w naszym drugim arkuszu kalkulacyjnym. (Zauważcie, że to podejście opiera się na założeniu, że pierwszy pusty wiersz w kolumnie A jest także pierwszym nieużywanym wierszem w arkuszu kalkulacyjnym.) W celu zlokalizowania pierwszego nieużywanego wiersza (zarazem lokalizacji, w której chcemy wkleić wycięty przed chwilą wiersz), zaczynamy od utworzenia obiektu Range składającego się wyłącznie z komórki A1:

Set objNewRange = objExcel.Range("A1")

W jakim celu to robimy? No cóż, żeby znaleźć pierwszy nieużywany wiersz, zasymulujemy działanie klawiszy Ctrl+strzałka w dół; po naciśnięciu Ctrl+ strzałka w dół w programie Excel, kursor przeskoczy na dół do ostatniej komórki w kolumnie zawierającej dane. Zanim jednak będziemy mogli to zrobić, musimy umieścić kursor w komórce A1, a to właśnie jest jedyny sposób, żeby to osiągnąć.

W tym momencie dokonujemy symulacji działania klawiszy Ctrl+ strzałka w dół, używając tylko jednego wiersza kodu:

objNewRange.End(xlDown).Activate

Używamy tutaj zarówno właściwości End, jak i metody Activate w celu przemieszczenia się na koniec kolumny (czyli ostatniej komórki w kolumnie zawierającej dane). W celu przemieszczenia kursora na koniec kolumny ustawiamy jako wartość właściwości End stałą xlDown; to informuje program Excel, że chcemy przejść na koniec kolumny. (Z technicznego punktu widzenia, przesuwamy kursor w dół do momentu napotkania pustej komórki.) Po wykonaniu tej czynności, wywołujemy metodę Activate w celu aktywacji tej komórki.

Wszystko jest OK, poza jedną rzeczą: w dalszym ciągu nie znajdujemy się w pierwszym nieużywanym wierszu tego arkusza kalkulacyjnego. Tak naprawdę, pierwszym nieużywanym wierszem w arkuszu jest wiersz znajdujący się pod nami. Jak przesunąć kursor o jeden wiersz w dół? Jest na to kilka sposobów. Ja wybieram ten:

intNewRow = objNewExcel.ActiveCell.Row + 1

strNewCell = "A" &  intNewRow

objNewExcel.Range(strNewCell).Activate

Przypisujemy tutaj wartość do zmiennej o nazwie intNewRow; przypisana wartość będzie numerem wiersza aktywnej komórki plus 1. Dlaczego „plus 1”? Ponieważ nie chcemy, żeby kursor znajdował się w obecnym wierszu, chcemy, żeby był w następnym.

Następnie przypisujemy wartość do innej, nowej zmiennej o nazwie strNewCell; ta zmienne otrzymuje przypisaną literę A plus wartość zmiennej intNewRow. Innymi słowy, jeżeli pierwsza nieużywana komórka w kolumnie A to A6, zmienna strNewCell otrzyma przypisaną wartość A6. W celu przesunięcia kursora do tej nowej komórki tworzymy zakres składający się z tejże komórki i wywołujemy metodę Activate. Nasz kursor znajduje się teraz w pustej komórce, znamy jej lokalizację (A6) i jesteśmy gotowi, żeby wkleić do niej dane.

Na szczęście to możemy zrobić za pomocą jednego wiersza kodu:

objNewWorksheet.Paste

Teraz został nam już tylko jeden problem: dane wklejone do nowego arkusza kalkulacyjnego w dalszym ciągu znajdują się w pierwszym arkuszu; jak zauważyłem już wcześniej, te dane nie zostają wycięte ze swojej pierwotnej lokalizacji. Ale to nie szkodzi. Mając obiekt Range odnoszący się do tych danych, wystarczy wywołać metodę Delete, a dane te zostaną usunięte z pierwszego arkusza kalkulacyjnego:

objOldRange.Delete

Wiem, trochę to dziwne i skomplikowane. Ale działa. Po kilkakrotnym uruchomieniu tego skryptu, w końcu zrozumiecie na czym on polega.

Mam nadzieje, że moja odpowiedź jest pomocna i mam też nadzieję, że za bardzo się o mnie nie martwicie. O tej porze roku taka pogoda to rzecz normalna i może być tylko gorzej. Jeżeli tak będzie, wtedy będziecie mieli prawdziwy powód do zmartwień.

 Do początku strony Do początku strony

Centrum Skryptów - Microsoft Office