質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

解決済

エクセルマクロでシート名をセルからひっぱりたい

macro-beginner
macro-beginner

総合スコア25

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

2回答

0グッド

0クリップ

67906閲覧

投稿2017/01/25 06:21

For i = 1 To 10 If i > 10 Then MsgBox "Bookがそんなにありません" Exit For End If Workbooks.Open op.Range("C2").Offset(i - 1, 0).Value With ActiveWorkbook Range("A1:AU3100").Copy Workbooks("CAB-Grapf.xls").Worksheets("sheet" & i).Range("A1:AU3100").PasteSpecial Paste:=xlPasteAll

このコードでやりたい事はセルC2からC11までのパスから指定のブックを開きそれをコピーして、
CAB-Grapf.xlsの各シートに貼り付けたいのですが、
今現在のコードだと、Worksheets("sheet" & i)となっているのでシート名が"sheet1"とか"sheet2"でしか読み込めません。

シート名は変更予定なのでこのままだといちいちマクロを修正しなければなりません。

なので指定のセルに例えばSampleと記入しておき、その値をひろってシートをよみこみたいです。

つまり、

Workbooks("CAB-Grapf.xls").Worksheets("sheet" & i).Range("A1:AU3100").PasteSpecial Paste:=xlPasteAll

の"sheet"の部分をセルからひっぱった値にしたいという事です。

いろいろ試してはみたのですが、ことごとく玉砕されてしまったのでどなたか教えていただきたいです。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

ベストアンサー

セルの値はCells.Valueで取得できます。
例えばB5セルの値であれば、Cells(5, 2).ValueとかCells(5, "B").Valueといった式で取得できます。

今回はこれを複数取りたいので、ループ処理で回します。
例えば最初から10シートとわかっていれば、

For i = 0 To 9 '対象シート名を取得 strSheetName = Cells(5 + i, "B").Value 'B5~B14まで順番にセルの値を取得 '貼り付け Workbooks("CAB-Grapf.xls").Worksheets(strSheetName).Range("A1:AU3100").PasteSpecial Paste:=xlPasteAll Next

といったコードで取得になります。

対象シートがいくつあるのかわからない場合、ループする回数も判断しなければなりません。

Do~Loopで無限ループして、B列が空欄になったらループを抜ける方法や、
B列の最終データ行(B列最下行から[CTRL]+[↑]を操作したセル)を調べてその行までループする方法などがあります。

'Do~Loopするサンプル i = 0 Do strSheetName = Cells(5 + i, "B").Value 'B5セルから順番にセルの値を取得 If strSheetName = "" Then Exit Do '取得したセル内容が空欄ならループを抜ける i = i + 1 Loop
'B列最終データまでループするサンプル For i = 5 To Cells(Rows.Count, "B").End(xlUp).Row '5行目~最終データ行までループ strSheetName = Cells(i, "B").Value 'セルの値を取得 Next

ブック内のすべてのシートを対象とするならもう少し楽にできそうですが、今回はセル値からシート名を取得したいということでしたので、ここでは割愛します。

参考になれば幸いです。

投稿2017/01/25 07:46

jawa

総合スコア3009

macro-beginner👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

macro-beginner

2017/01/25 08:04

できました!ありがとうございました!

0

ActiveSheetのセル "B1" にシート名が書かれているとして以下でいいのでは?

VBScript

1Dim sheetName As String 2sheetName = ActiveSheet.Range("B1").Value 3 4Workbooks("CAB-Grapf.xls").Worksheets(sheetname).略 5

セル B1 ~ B10 にシート名が文字列として記載されているとして以下のように
取得セルの範囲指定で"B"にループ変数の値を文字列として連結する

VBScript

1Dim sheetName As String 2For i = 1 To 10 3 sheetName = ActiveSheet.Range("B" & CStr(i)).Value 4 Workbooks("CAB-Grapf.xls").Worksheets(sheetname).略 5Next 6

投稿2017/01/25 06:43

編集2017/01/25 07:38
Y.H.

総合スコア7909

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

macro-beginner

2017/01/25 07:06

ご回答ありがとうございます。 すみません、説明が足りませんでした・・・ For文で回してシートが10枚ほどできるのでそれぞれのシート名を各セルからもってきたいのです。 例えば"B1"がsample1、"B2"がsample2、"B3"がsample3,というように記入してあったとして、 "sheet"の部分をその各セルから引張りたいのです。 つまり、"sheet1"を"sample1"、"sheet2"を"sample2"というような感じです。
Y.H.

2017/01/25 07:38 編集

for文でループして"B"にループ変数の値を文字列として連結するだけですよね? 一応回答に追記しておきました。
macro-beginner

2017/01/25 08:04

できました!ありがとうございました!

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。