• ベストアンサー

「セルにある値」名のシートのデータコピー方法

初心者なのですが上司に頼まれてしまい、うまく作れなくて困っています。 いろいろ調べて下のところまで作れましたが、他にどうしたら良いかわからなくなりました。 やりたい事 ・「集計シート」のセル(B3からB15)に入力したシート名から  一部のセルをコピーし、順に「集計シート」に貼り付ける 例:「集計シート」のB3にA B4にB B5にC    B6には空欄(これ以上はシートなし)  「Aシート」の(G1:J5)を「集計シート」のB5を先頭に貼り付け  「Bシート」の(G1:J5)を「Aシート」貼付分の後に一行入れ貼り付け  「Cシート」の(G1:J5)を「Bシート」貼付分の後に一行入れ貼り付け  以上 疑問 「Do until」で空欄になるまで貼付を繰り返せない(混乱中) 「Aシート」の貼り付け後に一行空けて、貼り付けの繰り返し (これはまったくわからない) 行 = 3 Do Until Range("B" & 行).Value = "" シート名 = Range("B" & 行).Value '←ここがエラーになります Worksheets(シート名).Select   '←この2行がまずおかしい? コピーセル範囲 = "G1:J5" 貼付先シート名 = "集計シート" 番号 = "D6" 貼付先左上端セル = "D7" Range(コピーセル範囲).Copy Worksheets(貼付先シート名).Range(貼付先左上端セル).Paste Application.CutCopyMode = False Sheets("集計シート").Select 行 = 行 + 1 Loop End sub

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

Aシート」の(G1:J5)やBシート」の(G1:J5)を、のJ5は固定したものなのか、5は最終行なのか。 関連して最下行を捉える d = Worksheets("集計シート").Range("G65536").End(xlUp).Row を知らないのだろう。便利だから勉強を売ること。 ーーー 注意 >B5を先頭に貼り付け B列にはシート名を入れている。ここの列の下方にデータを入れることは望ましくない。G7(G5にも出来る)にした。質問者で適当に修正をすること。シートを3つに固定してよくてFor i=2 to 5にして B6からデータを入れることは出来るだろう。 ーーー Msgbox wo除くと7行で出来ちゃう。 Sub test02() d = 5 '集約開始G5の5 For i = 3 To 15 If Worksheets("集計シート").Range("B" & i) <> "" Then sn = Worksheets("集計シート").Range("B" & i) MsgBox sn Worksheets(sn).Range("G1:j5").Copy Destination:=Worksheets("集計シート").Range("G" & d + 2) d = Worksheets("集計シート").Range("G65536").End(xlUp).Row MsgBox d End If Next i End Sub テスト 集約シート B3:B5 Sheet1 Sheet2 Sheet3 ーーー Sheet1 G1:J4 z 0 w 10 a 1 x 11 b 2 y 12 c 3 z 13 d 4 u 14 Sheet2,Sheet3も同じ範囲に類似データを作る 実行 集約シート G7:J23 最初の行を5行からなら,d = 5 '集約開始G5の5のところ をd = 3 '集約開始G5の5より z 0 w 10 a 1 x 11 b 2 y 12 c 3 z 13 d 4 u 14 z 11 w 20 a 12 x 21 b 13 y 22 ・・・以下略

uchin55
質問者

お礼

詳しい説明ありがとうございました。 上の構文を加工して、基本的な動作はなんとかするようになりました。 ですが「B3からB15に入力したシート名」の中に数値もあるのですが、 入力前にセルの表示形式を「文字列」にしないとエラーになります。 例:何も設定せずB3に50と入力 → エラー   表示形式を文字列に設定してからB3に50と入力 → 動作する シート名は「50」「61」「A」などがあります。 文字の型の問題だと思うのですが、どうやって設定したらよいのでしょうか・・・

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.5

#4です #3で追加した1行を削除してくださいと言うのを忘れてました すみません 解決して、良かったですね それでは

全文を見る
すると、全ての回答が全文表示されます。
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.4

#1、#3です 全角半角の問題では無いとの事なので >「インデックスが有効範囲にありません」のエラーからデバッグに入ると 集計シートのB3に空白かシート名に使用されていない文字列が入っている事が原因だと思います Excel2000で動作の確認は行っています まあ、imogasiさん(imogasiさん横から失礼します)のでうまく行っているようなので エラーの回避方法のみ Sub test02() dim sn as string 'この位置に1行追加   : 以上参考まで

uchin55
質問者

お礼

1行を追加する事で、無事エラーを回避する事ができました。 これで、セルの書式設定を「標準」にしているままでも、 数値のシート名の取得ができます。 「インデックスが・・・」のエラーは、B3は空白でもないし、 セルとシート名の全半角を別の判りやすい文字に揃えてもダメでした。 たぶん、自分がどこが間違っているんでしょうね。 ひとまず、無事目的の物ができあがりました。 回答者さま、imogasiさんありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

#1です >文字の型の問題だと思うのですが、どうやって設定したらよいのでしょうか・・・ 違うと思うけど 全角半角の問題だと思う 試しに 1行追加してみて    : For 行 = 3 To 5 シート名 = Worksheets(貼付先シート名).Range("B" & 行).Value シート名 = StrConv(シート名, vbWide)  '追加 If Worksheets(貼付先シート名).Range("d7").Value = "" Then   :

uchin55
質問者

補足

全角半角の問題ですか。 今回追加するのは、hige_082さんの構文に追加でいいんですよね? (上のアドバイスを見るとそうですよね?) 全角半角の問題が発生したのはimogasiさんの構文で作成した時のエラーです。 上の追加作業を行った結果、やはりエラーが発生します。 (#1の時に報告したエラーのままです) 今回アドバイスいただいたのは、半角全角の対応方法のみなので、 #1の時のエラー対応にはなっていないってことでしょうか。 また、全角半角についてチェックしてみましたが、 入力は、imogasiさんへの回答でも書いたとおりのパターン両方とも、 半角になっています。 エクセルの自動機能の為、セルに全角で数値を入力しても「半角で右による」し、セルの表示形式を「文字列」にした後でも半角で入力しています。

全文を見る
すると、全ての回答が全文表示されます。
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

こんばんわ もっと整理して考えれば >例:「集計シート」のB3にA B4にB B5にC  > 「Aシート」の(G1:J5)を「集計シート」のB5を先頭に貼り付け 「集計シート」のB5はシート名、それとも貼付の先頭? もう少し基本を勉強された方が良いですよ シートの指定の仕方が、よく理解できていないではと思います 条件が良く分からないので 参考程度に Sub test() Dim 行 As Integer Dim コピーセル範囲 As String Dim 貼付先シート名 As String Dim シート名 As String コピーセル範囲 = "G1:J5" 貼付先シート名 = "集計シート" For 行 = 3 To 5 シート名 = Worksheets(貼付先シート名).Range("B" & 行).Value If Worksheets(貼付先シート名).Range("d7").Value = "" Then Worksheets(シート名).Range(コピーセル範囲).Copy Worksheets(貼付先シート名).Range("d7") Else Worksheets(シート名).Range(コピーセル範囲).Copy _ Worksheets(貼付先シート名).Range("d65536").End(xlUp).Offset(2) End If Next End Sub

uchin55
質問者

お礼

ありがとうございます。 参考にして(というか、一度ほぼそのまま利用させてもらいました) ですが、下記の部分でエラーが発生します。 「インデックスが有効範囲にありません」のエラーからデバッグに入ると、 Worksheets(シート名).Range(コピーセル範囲).Copy Worksheets(貼付先シート名).Range("d7") が選択されています。 これはどこが悪いのやら・・・

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセル 特定のシートを異なるブックの指定したシートにコピーするマクロ

    エクセルの"貼り付け先.xls"の(シート名="集計")を開いている状態で、 別の異なるブックの"貼り付け元.xls"の(シート名="sheet1")の内容を全部コピーして "貼り付け先.xls"の(シート名="集計元データ")へ貼り付けるマクロは どのようになりますでしょうか? いろいろ調べて下記のように書きましたが、 インデックスが有効範囲にありませんというメッセージが出て、 デバッグを確認すると Workbooks("貼り付け元.xls").Worksheets("Sheet1").Range("A1").Copy_の部分が黄色く表示されてきます。 (1) "貼り付け先.xls"と"貼り付け元.xls"は同じパソコンのマイドキュメントに保存されています。 (2)"貼り付け元.xls"の"Sheet1"はセルA1から入力されていて、 内容は毎日変わります。 (3)Range("A1")や("A1:IV65536")のセル番地をいろいろ変えたりしても同じでした。 Sub クリップボードを経由せずにコピー貼り付けする_異なるブック() Workbooks("貼り付け元.xls").Worksheets("Sheet1").Range("A1").Copy_ Workbooks("貼り付け先.xls").Worksheets("集計元データ.xls").Range ("A1:IV65536") End Sub

  • sheetの末尾にコピーする方法

    エクセルVBAで売上帳を作っています。 ひとつのbookで、売上帳sheetと入力用sheetを作っています。 入力用sheetから売上帳sheetへコピーする際に、売上帳sheetが3行目で終わっていたら、次は4行目から、というふうにしたいのですが、できません。 下のコードで実行すると、売上帳sheetの表の最終行からの貼付けになってしまいます。 Sub 売上() 行番号 = Range("最終行").Row - 2 '入力用sheetの最終行の2行上の行番号取得し「行番号」に代入 セル = "F" & 行番号 Range("B8:" & セル).Select Selection.Copy '入力用sheetの対象部分をコピー Worksheets("売上帳").Activate '売上帳シートをアクティブにする 行 = Range("G4").CurrentRegion.Rows.Count + 1 'アクティブセル領域の行数 + 1 Range("G" & 行).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False '値の貼り付け End Sub どなたか教えてください。 宜しくお願いします。

  • シート間の値の貼り付け。 スマートにしたい。

    こんばんは。 エクセルのシート1の[d7]から シート2の[最終行]からカウントした数分(下の場合はシート1[d7]の値をc列に3行分)貼り付けるには下記のコードでOKと伺ったのですが、 この作業を何度も繰り返しさせているうちに動作が重くなってしまったような気がするのでが、シート1の[b2](貼り付け時に日付)[b3](VLOOKUPの計算式が入っているので値のみ)[b4](時刻)の形式でシート2のそれぞれ、隣接するd,e,l列に3行づつ貼り付けたいのですが、 何か方法は、ありますでしょうか。(それぞれ貼り付けたい形式も異なります。) n=3 Worksheets("Sheet1").Range("d7").Copy _ Destination:=Worksheets("Sheet2").Range("c65536").End(xlUp).Offset(1, 0).Resize(n, 1) ↓動作確認ができなくなってしまったので、試していないのですが、 上の式の値のみ貼り付け方法は下記でよいのでしょうか。 '値のみ貼り付け Set WWR1 = Worksheets("Sheet1").Range("c7") Set WWR2 = Worksheets("月度集計").Range("c65536").End(xlUp).Offset(1, 0).Resize(n, 1) WWR2.Value = WWR1.Value 宜しくお願い致します。

  • マクロでコピーしたセルと同じ数だけコピーしたい

    最近マクロの作成を始めた初心者です。 以前もこちらで質問しながら、下のようなマクロを作成したのですが、 少し追加で設定をしたいと思います。 どうやったら以下の設定ができるのでしょうか。 作成済み 「集計」のシートに「123」「402」「4002」などのシートの同じ番地(C10:F12)のセルの内容をコピーしたい その際、「集計」B3:B15に入力されているシート名のみ対象にしたい 最初は、「集計」F6を頭にして貼り付けたい コピーは、前のコピー分の下に連なる形でコピーしたい 追加したい事 例:E列に「123」のシートのB2の内容、D列に「123」のシートのB3の内容を上の構文で追加したすべての行にコピーしたい その下にも同じ条件で追加したい 例:●は様々な値です   「AB」や「あい」のように、コピーしたい  A B ● ● ● ●  A B ● ● ● ●  A B ● ● ● ●  あ い ● ● ● ●  あ い ● ● ● ●  あ い ● ● ● ●  現在、作成済みの分 Sub test() Dim sn As String d = 6 For i = 3 To 15 If Worksheets("集計").Range("B" & i) <> "" Then sn = Worksheets("集計").Range("B" & i) Worksheets(sn).Range("C10:F12").Copy Worksheets("集計").Range("F" & d + 1).PasteSpecial Paste:=xlValues, Transpose:=True d = Worksheets("集計").Range("F65536").End(xlUp).Row End If Next i End Sub

  • Excelマクロについて(セルのコピー)

    今、マクロで自動的にセルのデータを別シートに貼り付けるというものを作っています。 Private Sub コピー定義() Worksheets("sheet1").Activate 'sheet1をアクティブにする コピー元行 = 2 コピー先行 = 1 コピー元セル = "A" & コピー元行 コピー先セル = "A" & コピー先行 Worksheets("sheet1").Range(コピー元セル).Copy _ Destination:=Worksheets("sheet2").Range(コピー先セル) End Sub これで、sheet1のA2からsheet2のA1にコピーできるのですが、 Private Sub コピー定義() Worksheets("sheet1").Activate 'sheet1をアクティブにする コピー元行 = 2 コピー先行 = 1 コピー元行 = 2 コピー先行 = 1 コピー元セル = "A" & コピー元行 コピー先セル = "A" & コピー先行 コピー元セル = "B" & コピー元行 コピー先セル = "B" & コピー先行 Worksheets("sheet1").Range(コピー元セル).Copy _ Destination:=Worksheets("sheet2").Range(コピー先セル) End Sub とすると、B2の項目しかコピーされません。複数のセルを一度にコピーするマクロの作り方をご存じの方、ご伝授下さい。

  • 【VBA】Ifで他シートから検索しコピーする

    Excel vbaについて教えてください。 自分で作成したコードが、うまく動かず悩んでいます。 ●作りたいもの Sheet3のA列にある数字を検索値とし、 Sheet1のA列を検索し、合致する行のB列~最終列までコピーし、 Sheet3のB列から貼付する。 ※Sheet1にある列数(項目数)は不定です ●作成したマクロ Sub test() Dim sh1 As WorkSheet Dim sh2 As WorkSheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet3") d = sh2.Range("A1").End(xlDown).Row 'Sheet3検索値のA列のデータの最終行 g = sh1.Range("B1").End(xlToRight).Column 'Sheet1の最終列 k = 2 For i = 2 To d    'Sheet3最終行まで If sh1.Cells( i & "A") = sh2.Cells( 1,"A") Then '条件)Sheet1とSheet3のA列が合致 For j = 2 To g                      'Sheet1の最終列まで sh2.Cells( k , j ) = sh1.Cells( i , j ) 'Sheet1のB行から最終列をコピーしSheet3へ貼付 Next j End If Next End Sub いろいろ直していたのですが、Set sh2 = Worksheets("Sheet3")で「インデックスが有効範囲にありません」(同じブック内に同名シートがあるのに?)とエラーが出たり、 また、B行から最終列までコピーする際の範囲指定についてもよくわからず、 もっと他に良い方法が無いものかとお手上げ状態です。 どうぞ宜しくお願いいたします。

  • Excel VBA セルの値をシート名にしたいのです。

    こんばんは 新しくシートを挿入させて、「シート2」の値のみをコピーさせたいと考えています。 その新しく挿入させたシート名を「シート1」のせるA3とA4の文字列をあわせたものにしたいのですが、どうしたらよいのでしょうか。 途中まで考えたところでいきずまってしまいました。 どうか英知をお貸しください。 宜しくお願い致します。 A3には日付、A4には名前が入力されています。 Dim sheetName As String Worksheets("月度集計").Activate Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = Worksheets("Sheet1").Cells(3, 3).Value On Error Resume Next Worksheets(1).Name = sheetName On Error GoTo 0 Range("f2").Select

  • セルの値をシート名にするエクセルVBA

    件名のVBAを以下のように書きました B列の4からずっと下までのセルの値を次々とシート「ひな型」をコピーし増やしていくものです。 Sub テスト() ' ' Macro ' ' Dim target As Range Dim h As Range '見えてるセルを取得する。「全部隠れていた」場合も考える。 On Error Resume Next Set target = Worksheets("Sheet1").Range("B4:B" & Worksheets("Sheet1").Range("B65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible) If target Is Nothing Then Exit Sub 'シートを増やしていく For Each h In target On Error GoTo errhandle Worksheets(CStr(h.Value)).Select On Error GoTo 0 Next Sheets("Sheet1").Select Exit Sub errhandle: Worksheets("ひな型").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = h.Value Resume End Sub これだと、一応思った通りにはなるのですが B列のセルに複数同じ名前があった時に、既に作ったシートの名前がある場合 それは無視するという風に実行したいです お知恵をお貸しくださいませ

  • EXCEL VBA コピーしたシートへ値をコピペ

    選択対象シート数は4つで、シート名は、「101」「102」「103」「104」とします。 シート名「表紙」のA列のセルはA10:101 A11:102 A12:103 A13:104となっており、 使用者はとなりのB10~B14セルに「○」「×」を入力規則から選択します。 また、シート名「表紙」のB6セルには製造番号(例:AM01-130012)を入力しておきます。 「○」となっているシートのみ選択して、下記マクロにてコピーを作成します。 コピーしたシートすべてのB2セルに製造番号を入力します。 ここまではできていて、下記のプログラムを追加したいのですが、うまくいきません。 さらに、○を付けたのと同じ行のD10~L10、D11~L11、D12~L12、D13~L13セルに、 使用者が文字列を入れる場合と入れない場合があります。文字列は左のD列から順に入れます。 文字列があれば、○を付けてコピーした対応するシートの中のH3~P3セルへ貼り付けたいのです。 D10、D11、D12、D13セルが空白のときは何も処理は行わないとします。 たとえば、下記のようにB12セルが○で、D12セルに文字列があれば、 D12~L12セルの値を、コピーで作成したシート103の中のH3~P3セルへ貼り付けたいのです。 B11セルも○ですが、D11セルに文字列がないのでシートのコピーだけ行います。 アドバイスいただけると助かります。 VBA初心者で申し訳ございませんが、よろしくお願いいたします。 <表紙のシート>    A     B     C    D     E     F    G    H     I     J     K      L 5 6    AM01-130012 7 8 9  10 101    × 11 102    ○ 12 103    ○       A1-1  A1-2  A1-3  A1-4  A1-5  A1-6  A1-7  A1-8   A1-9 13 104    × <プログラム> Sub TestSample() If Application.CountIf(Worksheets("表紙").Range("B10:B17"), "*○*") = 0 Then MsgBox "部品番号が選択されていません。" Exit Sub End If Dim 製造番号 As String 製造番号 = Range("B6").Value Dim c As Range Dim flg As Boolean On Error Resume Next flg = True ThisWorkbook.Activate On Error GoTo ErrOut_ For Each c In Worksheets("表紙").Range("B10:B13") If c.Value Like "○*" Then Worksheets(c.Offset(, -1).Text).Select flg flg = False End If Next c If Not flg Then ActiveWindow.SelectedSheets.Copy ' コピーしたすべてのシートに製造番号を書き込む For Each 各シート In Worksheets With 各シート .Activate Cells(1, 2) = 製造番号 End With Next Exit Sub ErrOut_: MsgBox """表紙""シートに記載されたシート名" & c.Offset(, -1).Text & "は存在しません。, vbInformation" End Sub

  • 《エクセル2000》シート名をセルで指定する?

    「学校」「会社」「家庭」などをシート名に持つファイルがあります。 それぞれに入っている数字を「集計」シートに集計したいのですが、例えば集計シートのA1セルに「学校」などのシート名を表示させて、その「集計シートA1セルの値に該当する名前のシートのB1~B100を合計する」というのを、関数で表現するにはどうすればいいでしょうか?(VBAではなく) よろしくお願い致します。