エクセルのVBAでシートを追加更新する方法

このQ&Aのポイント
  • エクセルのVBAを使用して、同一ブックの中に同じ形式のシートを追加し、特定のセルの値を更新する方法について教えてください。
  • VBAを用いて、エクセルのシートを追加していく方法とセルの値を更新する方法について、初心者にもわかりやすく解説してください。
  • ExcelのVBAで同一ブック内に同じ形式のシートを追加し、特定のセルの数式を更新する方法について教えてください。初心者向けの手順を教えていただけると助かります。
回答を見る
  • ベストアンサー

エクセルのVBAでシートを追加更新していきたいのですがうまくいきません

エクセルのVBAでシートを追加更新していきたいのですがうまくいきません…。 すみません、どなたかぜひ教えてください。 エクセルはそこそこ使えますが、マクロ関係はまったくの初心者です。 excel2003で作業しています。 やりたいのは、実行することによって (1)同一ブックの中に同じ形式のシートを追加する。 (シート名は「0」「1」「2」…というように、ただの数字にしています) (2)セル「K4」の数式 「=I4+'( 1 )'!K4」を 「=I4+'( 2 )'!K4」 というように、どのシートでも、直前のシートのセル「K4」の数値と更新したシートのセル「I4」の数値の合計を「K4」に表示する。 (以下、「I5」「K5」、「I6」「K6」…も同様にしていきます) ようにしたいのです。 (2)のために、 Range("k4").Value = "=I4+'(" & Range("j1").Value - 1 & ")'!K4" (「J1」には、「新しいシート名(数字)と同じ数字」が入るようにしてあります) としましたが、 「 =I4+'(1)'!K4 」としたいのに、 「 =I4+'[1](1)'!K4 」 と表示され、うまくいきません。 また、実行するたびに、 「値の更新」ということで、ファイルを指定するよう指示が出ます。キャンセルすると「#REF!」になります。 何が原因なのか、どうすればいいのかがさっぱり分かりません。 身の程知らずなレベルに挑戦しているのかもしれませんが、どなたか助けていただければ幸いです。 よろしくお願いします! (よく分かっていないため、質問の仕方が適当でなかったらすみません…)

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

#コメント シートを追加するブックとマクロが載せてあるブックは別なのか同じなのかが不明です。 このため「どのブックに」一連の操作をしたらいいのか,マクロの中で記述できません。 #マクロを検討する前提 「前のシート」が存在しないシート名ゼロを作成するため,一連の操作を実施することはできない 基点となるシート名ゼロは,一番最初にマクロを実行するより前に既に作成済みである なお,全角文字のゼロと半角文字のゼロを間違えてはいけない サンプルマクロ: sub macro1()  dim n as long  'シートを作成する  worksheets.add after:=worksheets(worksheets.count)  on error goto errhandle  activesheet.name = n  on error goto 0  '数式を入れる  range("K4:K6").formula = "=I4+'" & n - 1 & "'!K4"  exit sub errhandle:  n = n + 1  resume end sub >何が原因なのか、どうすればいいのかがさっぱり分かりません J1に入れてあった式が間違ってると考えるのが妥当です。 存在しないシート(間違ったシート名)を参照しろと書かれた数式を投入しようとすると,そんなシートはこのブックに見あたらないけどどこにありますかと「値の更新」が現れ,そして無視ルと有りませんという意味の#REFになります。

cottondrop
質問者

お礼

ありがとうございました!! 丁寧に教えていただけて、本当に本当にうれしいです。 とても勉強になりました。 ご指摘の通り、そもそものシート名が間違っていたようです。 ただの数字だったファイル名に( )をつけたところ、きちんと更新してくれました。 (「うっかり」も知識が乏しいと巨大な落とし穴…) 本当に助かりました。 またの機会がありましたら、ぜひ次も教えていただければ幸いです。

その他の回答 (1)

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.1

こんばんは。 これでどうですか? Sub test()  Range("k4").Formula = "=I4+" & Range("j1").Value - 1 & "!K4" End Sub >(シート名は「0」「1」「2」…というように、ただの数字にしています) ただの数字では、別の事例で不具合が出た経験があります。 具体的には忘れました。1を1月にして解決した記憶があります。 今回もs0,s1,s2のようにしたほうがいいかも。

cottondrop
質問者

お礼

さっそく助けてくださってありがとうございます! 上述の通り変えてみても変わらなかったのですが、 ためしにファイル名に( )をつけたところ、きちんと更新してくれました。 ただの数字ってダメなんですね…。 勉強になりました。本当にありがとうございました!

関連するQ&A

  • EXCEL VBAマクロについて質問です

    Excel VBAマクロについて質問です ※Excel Ver.は2005でやってます 例のような感じで、 同じ列(列1)に或る同じ列名の数字(列2)を足して 違うセル、または違うブックの指定行に合計値を横並び表示させたいのですがうまくいきません 例のように 同じ言葉が含まれているもの(りんご・青りんご)は足して出したいと思ってます 【理想】実行前 ****************************** 番号  名前  個数 001   りんご  1 002   ばなな  2 003   いちご  3 001   青りんご 2 ****************************** 【理想】実行後 ****************************** 番号   りんご  ばなな  いちご 001    3      -     - 002    -      2     - 003    -      -      3 ****************************** ※「-」記号はついてなくても大丈夫です 現在、組んでいるコード・実行結果をのせておきました どなたか享受ください、お願いいたします j = 1 For i = 0 To Range("A65536").End(xlUp).Row cnt = cnt + Range("列2" & i).Value If Range("C" & i + 1).value <> Range("C" & i).value Then 'もし次の行が違う名 Range("任意セル" & j).Value = Range("A" & i).Value '列1 Range("任意セル" & j).Value = Range("B" & i).Value '列2 Range("任意セル" & j).Value = cnt '数字合計 j = j + 1 '出力行カウントアップ cnt = 0 End If Next

  • Excel VBAについて

    Excelで、指定したセル範囲の外枠に罫線を引き四角形を作り、B1の数字を変えていくと四角形を横に描いていくというマクロを作成したのですが、B1の数値を変えてマクロを実行すると以前に描いた四角形が残ってしまいます。これを数値を変えてマクロを実行すると、以前の四角形を消して新たに四角形を描くにはどうすればよいのでしょうか。何かいい方法があれば教えてください。宜しくお願いします。以下にコードを示しておきます。 Public Sub Main_Code() a = ThisWorkbook.Worksheets("Sheet1").Range("B1") If a = 2 Then Range("I26:K35").Select Selection.BorderAround Weight:=xlMedium Range("B1").Select ElseIf a > 2 Then Dim i As Integer For i = 3 To a Range("I26:K35").Select Selection.BorderAround Weight:=xlMedium Range("I26:K35").Select Selection.Copy Cells(26, 3 * i + 3).Select ActiveSheet.Paste Application.CutCopyMode = False Range("B1").Select  Next i  End If End Sub

  • エクセルのシート名更新のマクロについて

    エクセルのシート名更新のマクロについて B1の値を元に、シート名を更新するマクロでつまづいています。 (1)B1セルに9/1と入力したら、2010年9月と表示されるように 「セルの書式設定」で調整しています。 (2)「(1)」で表示された年と月の情報をシート名に反映させたいと 思っています。 そこで、次のコードを記入しました。 --------------------------------------------------- Sub 更新作業() 'ひと月更新する。 Worksheets(1).Activate Range("B1").Select For Each r In Selection r.Value = DateSerial(Year(r.Value), Month(r.Value) + 1, Day(r.Value)) Next r 'シート名を変更する。 Worksheets(1).Activate ActiveSheet.Name = Format(Range("b1"), "yyyy年m月") ' 数量を削除する。 Range("C4:D9").Select Selection.ClearContents Range("C4").Select End Sub --------------------------------------------------- この場合「ActiveSheet.Name = Format(Range("b1"), "yyyy年m月")」で エラーが出てしまいます。 なぜ問題が出るのか、 また、解決策があれば、教えていただけないでしょうか。

  • エクセルVBA抽出がうまく出来ません

    エクセル2013VBA初心者です。 入力シートからDBシートへ、DBシートから印刷シートへのデータ転記と印刷、入力内容のクリアまでは出来るようになりました。 DBシートの検索を行い、記録内容を入力シートに転記する抽出を行いたいのですが、下記構文を書いたところで問題が発生しました。 If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then  でとまります。メッセージは ‘Range’メソッドは失敗しました:‘Workshieet’オブジェクトというものです。 やろうとしていることは、入力シートに設けた“E12”と”G12”の二つの検索項目をキーにDBシートの行を特定し、この行の内容を入力シートに反映しようということです。 入力シートの検索項目“E12”、 ”G12”はそれぞれDBシートのA列、B列に格納されている項目で、年度と連番です。サンプルとして入力シート"C5"に抽出しようとしているDBシートD列は申請者名です。 恐れ入りますがよろしくご教示頂きたく、お願い申し上げます。 Sub DBシートから力情報を抽出する () Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim i As Long Dim j As Long Dim k As Long Set Sh1 = Worksheets("入力") Set Sh2 = Worksheets("DB") j = Sh1.Range("E12").Value k = Sh1.Range("G12").Value With Sh2 For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then Sh1.Range("C5").Value = Sh2.Range("D & i").Value End If Next  End With End Sub

  • VBAでシートが追加されたタイミングで動かしたい

    いつもお世話になっております。 掲題の通り、マクロが動くタイミングを、 そのファイルにシートが追加されたときに自動で動くように したいのですが、どのようにしたらいいでしょうか。 具体的に言うと、シートを追加すると、そのシート名を自動で セルの値から取得し、変更してほしいのですが…。 今は以下のように作っています。 Sub シート名変更() Range("N3") = "=VLOOKUP($I$9,Sheet1!$V$2:$W$22,2,0)" ActiveSheet.Name = ActiveSheet.Range("N3") End Sub 申し訳ありませんがご教授いただけたら幸いです。 宜しくお願い致します。

  • エクセルVBA シートの追加と名前の変更

    エクセルに「原本」シートがあり、マクロを実行すると原本シートを5シート(5日分)追加し、 (1)一つ目に追加したシートのB2のセルに「追加する日の日付け」を入力し、 シート名にその日付をyymmdd形式で名前を付け、 (2)二つ目に追加したシートのB2のセルに「追加する日の次の日の日付け」を入力し、 ・・・同様の処理・・・ (6)一つ目の追加したシートをアクティブシートにする。 というように、連続した5日分のシートを追加したいと考えています。 VBAの全くの初心者ですので教えていただけると大変助かります。 そんな素晴らしいことが短時間で教えていただけるものなのでしょうか。

  • エクセル上のVBA

    当方、VBAまるっきり初心者です(触りはじめて3日くらい)。 エクセルはある程度理解しているつもりですが… バージョンはエクセル2000です。 他シートのセルのひとつに入力すれば、 別シートのセルがそれを参照したうえで 値として表示出来るようにならないでしょうか。  今のところ、以下のような状況です。 step01 sheet1のセルA1に任意の数値(整数限定です)を入力。 step02 sheet2のセルA1に、sheet1のセルA1の数値を用いて     MOD関数で余りを出す。 step03 sheet2のセルB2に以下のVBAによって     step02の余りを値として表示。      Private Sub Worksheet_Change(ByVal Target As Range)        Range("b2").Value = Range("a1")      End Sub  これだとsheet1の数字を変えても、 sheetの切替後sheet2のセルB2に 表示される値が変わってくれません。  最初の入力(step01の入力)をおこなえば sheet2のセルB2まで値が変わってくれるような方法を 教えていただけないでしょうか。  拙い説明で申し訳ありませんが、よろしくお願いします。

  • エクセルVBAで、シートをコピーした際、コピーされた新しいシートのほう

    エクセルVBAで、シートをコピーした際、コピーされた新しいシートのほうを指定する言葉を知りたい。 コマンドボタンにて、(1)内訳用シートをコピーで増やす。(2)新しいシートの番号を連番になるよう1増やす。(3)新しいシートのほうは入力しやすいよう、入力欄を消去する。シート名も1.2.3...とふえていくようにしたい。 新しくコピーされたほうのシートを指定したい場合はどのようなVBA用語になりますか? いまは、元のシート指定方法しかわからないため、元シートの前にコピー作成し、元シートのNoを1増やし、データ消去で対応していますが、これだと、シート名に表示される内訳(1)(2)・・という番号になるので、できれば、コピーしたほうのシートを指定して、Noを1増やし、データ消去できれば解決するとおもうので。。いま、使ってるVBAはこんな式です。 ちなみにK6はシートNo、("B10:H30")("J10:K30")は入力欄です。 Private Sub CommandButton1_Click() ActiveSheet.Copy Before:=ActiveSheet Range("K6").Value = Range("K6").Value + 1 Range("B10:H30").ClearContents Range("J10:K30").ClearContents ActiveSheet.Select ActiveSheet.Name = Range("K6").Value End Sub

  • エクセル 別シートから値を検索して挿入 VBA

    いつもお世話になっております。 VBAにて、Sheet1 の【原価】に【商品】をキーにしてSheet2の【原価】を検索して挿入するコードを作成しました。 元々Shee1の【原価】にはすでに数値が入っていますが、下記のコードを実行すると上書きする処理のため、検索にヒットしない商品の【原価】はエラー【#N/A】となります。 ※画像参照願います。 目的はヒットする商品名の【原価】のみが更新される、 ヒットしない場合エラー【#N/A】を出さないようにする。 改良をご教示頂ければ助かります。 Sub データ検索() Application.ScreenUpdating = False Dim I As Long   I = 2 Do While Range("A" & I).Value <> ""  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = _   Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, Worksheets ("Sheet2").Range("A2:B65535"), 2, 0)  I = I + 1 Loop Application.ScreenUpdating = True End Sub

  • Val関数をVBAで使うには?

    助けてください VBA初心者です Excel VBAでA列の4からj行目までの文字列(例:"12345678” 8桁固定)、k行目までの数字以外の文字列(例:AB12345678 9桁以上ある)のうち、j行目までの文字列をVal関数で数値に変換したいのですが、どうやっていいのか分かりません j+1行目からk行目までは数字以外の文字列が入っています 1セルだけの変換はできます(例:A4セルに"12345678”がある場合、Val(range("A4"))で12345678が出ます) ※仮にj=98と固定しました Sub Value_num() J = 98 'A列を値→数字に変換 Columns("A").Select 'Range("A4").Value = val(Range("A4")) これは動く Range(Cells(4, 1), Cells(J , 1)).Value = val(Range(Cells(4, 1), Cells(J, 1))) 'これが動かない End Sub

専門家に質問してみよう