[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『1.1行おきに参照したい。2.複数のシートを1枚にまとめたい。』(えま)
初めまして。
1つのブックの中の1枚目のシートに、19列×約50行の表があります。A1〜S1のセルにはそれぞれの項目名が入っています。A2〜S2にはデータが入っています。A3〜J3は空白、K3〜Q3にはK2〜Q2とは別のデータが入っています。R3, S3は空白です。
A B C D E〜 K L M 〜Q R S
1 それぞれの項目名
2 * * * * * *■■■■■ * *
3 - - - - - -▲▲▲▲▲ - -
4 * * * * * *■■■■■ * *
5 - - - - - -▲▲▲▲▲ - -
6 * * * * * *■■■■■ * *
7 * * * * * *■■■■■ * *
8 - - - - - -▲▲▲▲▲ - -
上のAからSは列を、1から8は行を表しています。*は数値ですが、すべて違う数値です。規則性はありません。■と▲も数値です。参照しない列の数値なので、*と別の表記にしました。-は空白を表しています。
1行目にデータ、2行目は空白、が基本の組み合わせですが、(もとは結合したセルでしたが、結合を外しました)たまに、6〜8行目のように、6行目の下は空白ではなく、7行目に別のデータが入り、8行目は空白になっています。 空白行がある行の上のデータを、下の行にコピー&貼り付けをし、下に空白行がない場合は何もしない、ということはできますか?
また、同じ形のシートが110枚あるのですが、最終行(表の行数)がバラバラです。この110枚のシートを1枚にまとめることはできますか?ちなみにシート名は会社名になっていて、シート名にSheet1,Sheet2のような統一性はありません。
マクロに関しては初心者ですが、関数では難しいのではないかと思い、マクロでできないかといろいろ調べてみました。でも、私の力では解決しませんでした。
Excel2010, WindowsXPを使っています。
どなたか、お知恵を授けてくだされば嬉しいです。よろしくお願いします。
単純にすべてのシートのA:S50 をつなげて1シートにすればよいのですか?
それとも行数はある列の最終セル位置と判断がつくでしょうか。
とりあえず、新規ブックにまとめるサンプルです。
Sub MakeOneSheet() Dim dstWS As Worksheet Set dstWS = Workbooks.Add().Worksheets(1)
Dim ws As Worksheet Dim dstRow As Long dstRow = 1 For Each ws In ThisWorkbook.Worksheets lastRow = ws.UsedRange.Rows.Count dstWS.Cells(dstRow, "A").Value = ws.Name ws.Range("A1:S" & lastRow).Copy _ Destination:=dstWS.Range(dstWS.Cells(dstRow, "B"), dstWS.Cells(dstRow + lastRow - 1, "T")) dstRow = dstRow + lastRow Next End Sub
(Mook)
>単純にすべてのシートのA:S50 をつなげて1シートにすればよいのですか?
それとも行数はある列の最終セル位置と判断がつくでしょうか。
すべのシートの最終セル位置がばらばら(あるシートはA:S50, 別のシートはA:S46)です。
Mookさんに教えていただいたサンプルが使えないことは私の知識不足が原因だと思います。
マクロについてネット上で調べるだけでは不十分だと思い、初心者向けのVBAの本を2冊購入してきました。
今日中にもう一度トライしてみます。どうなったかご報告しますね。
ありがとうございました。
(えま)
エラーが出たのか、何も反応が無いように見えるのか、で対応が異なってきますので。
EXCEL2010 ということで、マクロが使えるようになっているかどうかが気になりますが、
例えば標準モジュールで
Sub Test()
MsgBox "Hello!!" End Sub は動きますか? (Mook)
>とりあえず、新規ブックにまとめるサンプルです。
このサンプルをもう一度試してみると、できました!
事実をお伝えするのが恥ずかしいのですが、「Visual Basic」の「Sub/ユーザーフォームの実行」をしていなかったのです。。。
というのも、Mookさんに教えていただく直前に、Web上で公開してある手順をずっと試していまして、
その手順として、「1.新しいシートを作る」「2.データの入ったシートを一つ選び、右クリック」「3.コードの表示をクリック」「4.サンプルを貼り付け」「5.2.のシートに戻りどこかのセルをクリック」 というものでした。
手順通りやってみると、110枚のシートが繋がるのですが、すべてのシートの最終行が2行セットではなく、1行で終わっていて、どうもところどころ途中で抜けているデータがあるみたいなのです。でも、マクロは実行されているし、これすごい!(エクセル上で、バババっと画面が動いてたくさんのシートのデータが1枚になる、という動作を見ているだけで感動していました…)
この手順を何度も行って、???となった後に、Mookさんに教えていただいたサンプルを試してみたのですが、「5.2.のシートに戻りどこかのセルをクリック」しても、何の反応もしません(エラーも出ません)。何度も保存しないで終了し、やり直してみるけどやっぱり何の反応もないのです。
>新規ブックにまとめるサンプルです。
「新規ブック」と書いてくださっているのに、「新しいシート」と思い込み、同じ間違いを繰り返していました。。
気が付いた時には恥ずかしいのと申し訳ないのでほんとうになんといえばいいのか・・・
本当にありがとうございました。
ちなみに、新しいブックで上のHello!を試してみましたが、実行すると小さなウィンドウが開き、「Hello!」と書かれていて、「OK」ボタンを押すと小さなウィンドウが消え、見た目はエクセルの中には何も書かれていないようでした。
お手間を取らせた上にもう一つの質問をするのは心苦しいのですが、
>1行目にデータ、2行目は空白、が基本の組み合わせですが、(もとは結合したセルでしたが、結合を外しました)たまに、6〜8行目のように、6行目の下は空白ではなく、7行目に別のデータが入り、8行目は空白になっています。
空白行がある行の上のデータを、下の行にコピー&貼り付けをし、下に空白行がない場合は何もしない、ということはできますか?
教えていただけると嬉しいです。
もし、よければお願いします。
(えま)
他にもユーザフォームなどもありますが、これだけでも覚えておくと話がしやすいです。
とりあえずシートをくっつける部分は、上のサンプルでよかったということでしょうか。
(勝手にA列をシート名にするなど、位置をずらしていますが。)
マクロが希望という事であれば、例示しますけれど今回希望されていることは簡単な操作
で実現することができます。
例えばその処理をしたい範囲がB1:B5000だったとします。最初の空白セルが B7だったと
するとB7に下記の式を書き、Ctl+C をしておきます。
=B6
B7が波線で囲まれている状態で、
B8:B5000を選択して Ctl+G を押し、
セル選択 ⇒空白セル にチェックをして OK を押します。
空白が選ばれるので、そこで Ctl+V を押します。
もし貼り付けた式を、式ではなく値にしたければ、
B列を選んでCopy、形式を選択して貼り付けで値を選びます。
マクロでやりたいという事であれば、参考までのサンプルです。
Sub EmaCopy()
For r=8 To 5000 If Cells(r,"B").Value = "" Then Cells(r,"B").Value = Cells(r-1,"B").Value End If Next End Sub (Mook)
まず、簡単な操作はMookさんが指示してくださった通りに行うと、すぐにできました。ただ、処理したい範囲がB4:K3470、S4:T3470です。(#L〜R列にはそれぞれ別々のデータが全行に入っていて、空白行はありません。)その処理のために、最初の空白行である、B4セルの中に=A3と入力した後、数式のコピーをB4:K4、S4:T4まで行いました。すると、数式ボックスの中はそれぞれB3:K3、S3:T3になっているのにも関わらず、すべてのセルにA3のデータが張り付けられました。
よくわからないまま、マクロのほうが簡単なのかもと思い、買ってきた本を片手にMookさんが作成してくださった上のサンプルに、C:KとS:Tに対しても同じように書けないかと格闘しましたが、力尽きました。
唯一 For r=8 to 5000 を For r=4 to 3470に書き換えると、ちょうど実行したかった通りになり、嬉しかったです。
B列のみでなく、C列からS列(L〜R列には空白行がないので、L〜R列をプログラムの中に入れても問題ないと思いました)にも同じ処理が行える書き方を教えていただけないでしょうか。
お願いばかりで申し訳ありませんが、よろしくお願いします。
(えま)
マクロは r が行を意味しているということは、理解されているようですね。
今回は B と書きましたが、列も数字で表してもいいです。
Sub EmaCopy() For c=2 To 11 ' B:K For r=8 To 3470 If Cells(r,c).Value = "" Then Cells(r,c).Value = Cells(r-1,c).Value End If Next Next For c=19 To 20 ' S:T For r=8 To 3470 If Cells(r,c).Value = "" Then Cells(r,c).Value = Cells(r-1,c).Value End If Next Next End Sub としたらできるでしょうか。
行や列はいろいろな指定ができますが、 少し先の応用として、 Sub EmaCopy() For Each c In Range("B1:K1,S1:T1") For r = 8 To 3470 If Cells(r, c.Column).Value = "" Then Cells(r, c.Column).Value = Cells(r - 1, c.Column).Value End If Next Next End Sub のようにしても同じ処理になります。
最終行を取得するマクロというのは、よく使うので(本にも出ていると思いますが) 調べてみると 3470 が変わっても使えるコードになるでしょう。 Cells(Rows.Count,c.Column).End(xlUp).Row のような式で取得できるので、興味があったらいろいろ試してみてください。 (Mook)
最終行を取得するマクロについては、明日の仕事中に時間を見つけてやってみようと思います。
今回Mookさんに丁寧に教えて頂きながら、買ってきた本を読んでみて気が付いたのですが、
今まで単純作業の繰り返しを、時間をかけてやっていたのだということと、
マクロって面白そう!ということです。
上のほうはショック大、でしたが、今まで敬遠していたマクロが実は面白いかも、と思えた
ことはよかったです。いろいろ試してみますね。
あと、エクセルを使用する際、コピー、貼り付け、切り取り、繰り返し、検索、置換、印刷は
キーボード上でやっているのですが、他にもいろいろと機能があるのですね。
マウスを使うより、キーボード上で処理をするほうが楽ですから、こちらも調べて覚えます。
Mookさん、最後まで付き合ってくださって本当にありがとうございました。
このお礼は次に困っている人を手助けするという形でさせてもらおうと思います。
(えま)
>B4セルの中に=A3と入力した後、 は =B3 の書き間違いだったと思いますが、一つ上のセルを参照するという式ですね。
ただ、もし空白に見えているセルが既に数式が入っているようでしたら、この方法は 使えませんでした。このあたり説明不足でした。
>今まで敬遠していたマクロが実は面白いかも、と思えたことはよかったです。 と思えたことは良かったですね。いろいろと活用してみてください。
> このお礼は次に困っている人を手助けするという形でさせてもらおうと思います。 EXCELの学校でも活躍されるのを楽しみにしています ^^ (Mook)
B4セルの中に=A3と入力した後、
は =B3 の書き間違いだったと思いますが、一つ上のセルを参照するという式ですね。
そうです。書き間違いでした。ごめんなさい。
ただ、もし空白に見えているセルが既に数式が入っているようでしたら、この方法は
使えませんでした。このあたり説明不足でした。
ありがとうございます。
昨日もう一度このやり方をやってみたら、簡単だし、早いし、再び感動しました。
EXCELの学校でも活躍されるのを楽しみにしています ^^
はい。Mookさんのように優しく丁寧に手助けできるように、頑張ります。
本当にありがとうございました。
(えま)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.