• ベストアンサー

(VBA)対応する番号の下に行挿入して文字列を追加

以下を行うVBAのコードを知りたい シート名「Extra」のA列に文字列が複数行に渡って記入されています 必ずA1は1で数行後に2と以後連番が続く形式です。 Sheets名「Time」は、 A列に1から始まる連番 B列にA列に対応する文字列が対であります。 やりたいことは、 「Time」のA列の連番と「Extra」にある同じ連番行の一つ下に行を挿入して 「Time」のA列と同じ行のB列の文字列を書き込みです。 例えば、「Extra」が 435 ABC で 「Time」 435 123456 ならば 「Extra」を以下のように書き換える 435 123456 ABC 判りにくい内容でしょうがよろしくお願いします。 ’-----------------------------------------

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.8

> ret = Sheets("Extra_Original").Delete > If ret = False Then > Exit Sub > End If If ExistsSheet("Extra_Original") Then が抜けてます。retは削除の時にキャンセルした時の対応ですのでシートの有無はチェックしたほうがいいのではないでしょうか。 If ExistsSheet("Extra_Original") Then ret = Sheets("Extra_Original").Delete If ret = False Then Exit Sub End If End If

その他の回答 (7)

  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.7

回答No.5で > これだと、途中に該当シートがあって以降別シートがある場合該当シートは存在しないという結果報告になりませんか と、だらだら書きましたが 途中がどうであれ最後のシートが該当シートかどうかだけで結果判定されないでしょうか。 ですね。

  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.6

今気が付いたのですが Sheets("Extra_Original").Delete の時に確認のダイアログが出ると思いますがそこでキャンセルするとエラーになりますので Dim ret As Boolean で ret = Sheets("Extra_Original").Delete If ret = False Then Exit Sub End If のようにしておいてはいかがでしょう。

NuboChan
質問者

お礼

kkkkkmさん、ダメ出しありがとうございます。 アドバイスを受けてコードを修正しました。 Sub Test() '対応する番号の下に行挿入して文字列を追加 Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet Dim SheetName As String Dim i As Long, j As Long Dim ret As Boolean Set Ws1 = Sheets("Extra") Set Ws2 = Sheets("Time") ret = Sheets("Extra_Original").Delete If ret = False Then Exit Sub End If Worksheets("Extra").Copy After:=Worksheets(Worksheets.count) ActiveSheet.Name = "Extra_Original" For i = Ws1.Cells(Rows.count, "A").End(xlUp).Row To 1 Step -1 For j = Ws2.Cells(Rows.count, "A").End(xlUp).Row To 1 Step -1 If Ws1.Cells(i, "A").Value = Ws2.Cells(j, "A").Value Then Ws1.Rows(i + 1).Insert Ws1.Cells(i + 1, "A").Value = Ws2.Cells(j, "B").Value Exit For End If Next Next Set Ws1 = Nothing Set Ws2 = Nothing End Sub Public Function ExistsSheet(ByVal bookName As String) As Boolean Dim ws As Worksheet For Each ws In Sheets If LCase(ws.Name) = LCase(bookName) Then ExistsSheet = True ' 存在する Exit For Else ExistsSheet = False ' 存在しない End If Next End Function

  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.5

> >ドロップダウンが出るので「うむうむよしよし」的な気分になります。 > > これは、どういう意味でしょうか ? タイプミスしているとドロップダウンは出ないのでミスなく出て満足じゃのようなことです。 For Each ws In Sheets If LCase(ws.Name) = LCase(bookName) Then ExistsSheet = True ' 存在する Else ExistsSheet = False ' 存在しない End If Next これだと、途中に該当シートがあって以降別シートがある場合該当シートは存在しないという結果報告になりませんか ExistsSheet = True ' 存在する Exit For で抜けるとかした方がいいような気がします。

  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.4

> >ドロップダウンが出るので「うむうむよしよし」的な気分になります。 > > これは、どういう意味でしょうか ? タイプミスしているとドロップダウンは出ないのでミスなく出て満足じゃのようなことです。

  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.3

細かい事でどちらでもいい話かもしれませんが Public Function ExistsSheet(ByVal bookName As String) 戻り値の型指定がないのを書いた記憶が無かったので、Functionの戻り値のデータ型指定がなく一瞬戸惑いました。 Public Function ExistsSheet(ByVal bookName As String) As Boolean としておくと ExistsSheet = でTrueとFalseのドロップダウンが出るので「うむうむよしよし」的な気分になります。 (オプションで自動メンバー表示にしておけばですが) コードを見た時にも何を戻り値にしてるのか分かるのでいいと思いますし、間違った型を返そうとしたらエラーになりますのでその点もいいのではないかなと思います。(ただ、Booleanの場合は数値を返すとエラーにならないのですが) あとbookNameだったのでブックがどこかで出てくるのかとしばらくコードを眺めました。 Dim ws As Variant はシートなので Dim ws As Worksheet がいいのではないでしょうか。

NuboChan
質問者

お礼

アドバイスありがとうございます。 継ぎ足しのコードなのでやはりおかしかったですね。 以下に修正しました。 Public Function ExistsSheet(ByVal bookName As String) As Boolean Dim ws As Worksheet For Each ws In Sheets If LCase(ws.Name) = LCase(bookName) Then ExistsSheet = True ' 存在する Else ExistsSheet = False ' 存在しない End If Next End Function As Boolean で戻り値がどんな形式かがすぐわかるので宣言すべきですね。 >ドロップダウンが出るので「うむうむよしよし」的な気分になります。 これは、どういう意味でしょうか ?

  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.2

ExtraのA列が数値の時だけTimeを検索するのでしたら Sub Test3() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim i As Long, j As Long, LastRow As Long Set Ws1 = Sheets("Extra") Set Ws2 = Sheets("Time") LastRow = Ws2.Cells(Rows.Count, "A").End(xlUp).Row For i = Ws1.Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1 If IsNumeric(Ws1.Cells(i, "A").Value) Then For j = LastRow To 1 Step -1 If Ws1.Cells(i, "A").Value = Ws2.Cells(j, "A").Value Then Ws1.Rows(i + 1).Insert Ws1.Cells(i + 1, "A").Value = Ws2.Cells(j, "B").Value LastRow = j - 1 Exit For End If Next End If Next Set Ws1 = Nothing Set Ws2 = Nothing End Sub

NuboChan
質問者

お礼

kkkkkmさん、毎回お世話になりありがとうございます。 テストDATAで実際に3つのコードを検証しました。 結果、全ての満足な状態で出力されました。 コードをお借りしてコードを以下のように修正しました 何かアドバイス有ればお願いします。 Sub AddTimeLine() Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet Dim SheetName As String Dim i As Long, j As Long Set Ws1 = Sheets("Extra") Set Ws2 = Sheets("Time") If ExistsSheet("Extra_Original") Then Sheets("Extra_Original").Delete End If Worksheets("Extra").Copy After:=Worksheets(Worksheets.Count) ActiveSheet.Name = "Extra_Original" For i = Ws1.Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1 For j = Ws2.Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1 If Ws1.Cells(i, "A").Value = Ws2.Cells(j, "A").Value Then Ws1.Rows(i + 1).Insert Ws1.Cells(i + 1, "A").Value = Ws2.Cells(j, "B").Value Exit For End If Next Next Set Ws1 = Nothing Set Ws2 = Nothing End Sub Public Function ExistsSheet(ByVal bookName As String) Dim ws As Variant For Each ws In Sheets If LCase(ws.Name) = LCase(bookName) Then ExistsSheet = True ' 存在する Exit Function End If Next ' 存在しない ExistsSheet = False End Function

  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.1

Sub Test() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim i As Long, j As Long Set Ws1 = Sheets("Extra") Set Ws2 = Sheets("Time") For i = Ws1.Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1 For j = Ws2.Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1 If Ws1.Cells(i, "A").Value = Ws2.Cells(j, "A").Value Then Ws1.Rows(i + 1).Insert Ws1.Cells(i + 1, "A").Value = Ws2.Cells(j, "B").Value Exit For End If Next Next Set Ws1 = Nothing Set Ws2 = Nothing End Sub というようにいつも全てのデータをチェックするのではなく、連番なので既にチェックしたデータは外したいという事だとしたら Sub Test2() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim i As Long, j As Long, LastRow As Long Set Ws1 = Sheets("Extra") Set Ws2 = Sheets("Time") LastRow = Ws2.Cells(Rows.Count, "A").End(xlUp).Row For i = Ws1.Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1 For j = LastRow To 1 Step -1 If Ws1.Cells(i, "A").Value = Ws2.Cells(j, "A").Value Then Ws1.Rows(i + 1).Insert Ws1.Cells(i + 1, "A").Value = Ws2.Cells(j, "B").Value LastRow = j - 1 Exit For End If Next Next Set Ws1 = Nothing Set Ws2 = Nothing End Sub

関連するQ&A

  • VBA 行挿入

       A      B       C       D      E    F     G 1 連番   学校名    氏名     性別         ブレザー 2                        男子    女子  SIZE   数量 3  1    中学校1   氏名1      1          155A  1 4  2    中学校1   氏名2             1   150A  1 5  3    中学校1   氏名3      1          160A  2 6  4    中学校1   氏名4             1   150B  2 7  5    中学校1   氏名5      1          155B  1 とSheet1にありまして、HとI列を作り数量入れたいです。G列の数量が1以外のところは 行を挿入します。Hは分子Iは分母という意味です。    A      B       C       D      E    F     G      H      I 1 連番   学校名    氏名     性別          ブレザー        ブレザー 2                        男子    女子  SIZE   数量    数量   数量 3  1    中学校1   氏名1      1          155A  1      1     1 4  2    中学校1   氏名2             1   150A  1      1     1 5  3    中学校1   氏名3      1          160A  2      1     2 6  3    中学校1   氏名3      1          160A  2      2     2 7  4    中学校1   氏名4             1   150B  2      1     3 8  4    中学校1   氏名4             1   150B  2      2     3 9  4    中学校1   氏名4             1   150B  2      3     3 10 5    中学校1   氏名5      1          155B  1      1     1 1と2行目は初めから入ってるとします。VBAで入れられるのであれば入れたいですが。 連番は何番まであるかわかりません。 宜しくお願いします。

  • 【VBA】 通し番号の入力について

    こんばんは。 こちらの識者の方々にはいつもお世話になっています。 VBAの件で質問があります。 B列の最終行までA列に001から文字列で連番を振りたい場合、どのような構文になりますでしょうか。 Range("A1:A" & Range("B" & Cells.Rows.Count).End(xlUp).Row).Value = Format(row, "000") は通らなかったのですが、なにかいい構文はありますでしょうか。 データは必ず1000行以下ですので、番号は3桁で大丈夫です。 よろしくお願いいたしますm(_ _)m

  • エクセルVBA 文字列複数行・列連続連結

    エクセルVBA 文字列複数行・列連続連結でお教え下さい A列に基本文字(縦順) B列~F列に複数行データー(文字・時間) 文字結合時に改行 例 A2&B2&改行&A3&C2&改行&A4&D2&改行・・・・・ 次のデーター行 A&B3&改行&A3&C3&改行&A4&D3&改行・・・・・ データーの最終行まで連続で このような複数行あるデーターの連続文字列連結をしたいのですが・・・ 文字列連結後は 1.指定セルに貼り付け 2.クリップボードに貼り付け 3.テキストファイルに保存 よろしくお願い致します

  • VBAのオートフィルタのタイトル行

    3行目をタイトル行として、3行目以降(で13列にABCという文字列が入っている行)をセレクトすることは可能でしょうか? 以下のようなコードを書くと、1行目にオートフィルタがかかり、1行目もセレクトされてしまいます(13列にABCという文字列が入っている行は正しく選択されています)。 なお、A列はブランク、B1、B2には検索とは無関係の文字列が入っております。 どうぞ宜しくお願いいたします。 Sub 絞り込み() With Worksheets("マスタ0701").Range("B3") .AutoFilter Field:=13, Criteria1:="ABC" .CurrentRegion.Select '.AutoFilter End With End Sub

  • エクセル 行挿入のマクロについて

    こんばんは、エクセルのマクロについてお伺いします。 現在 A1:支店名 B1:連番 C1:在庫数 全部で1000行位入力があります。 ・A列には支店名 ・B列には連番は1・2・3~と1000件位 ・c列には在個数にはそれぞれ1桁から2桁の数字 【質問】 在庫数の数だけその連番の行を増やしたい。 例えば、 A2:東京支店 B2連番:1 C2在庫数:3 だとすると2行目のあとに2行挿入し在庫数が3なので下記のように3行にしたい。 A2 東京支店 B2連番 1 C2 在庫数 1 A3 東京支店 B3連番 1 C3 在庫数 空欄 A4 東京支店 B4連番 1 C4 在庫数 空欄 何せ数が多いのでマクロをお教え頂ければ助かります。 ※その際、支店名と連番は同じ物がはいるとありがたいです。 ※在庫数は空欄で構いません。 マクロでなくても方法があればお教え下さい。 よろしくお願い致します。

  • DOS:テキスト内の特定行の次行に文字列を追加

    DOSコマンドプログラムでテキストファイル内の特定文字列を含む行の次の行に、指定した文字列を含む行を挿入する方法 Windows7の DOSコマンドプログラムで、下記の"input1.txt" を"output1.txt"に変換したいと思っています。 "input1.txt"内で"Name:"を含む文字列があれば、その行の次の行に、"A1:10.2"という行を挿入するDOSコマンドプログラムをご教授いただけないでしょうか。見つけた文字列行の次の行に挿入する方法というのが、できなくて困っています。 ---input1.txt------ Name: Tanaka B1: H2 C1: 2 Comment: ABC# 61, Seq# M34 Num H: 3 12 37.97 13 105.90 14 203.82 Name: Suzuki B1: H2 C1: 2 Comment: ABC# 58, Seq# M39 Num H: 2 11 37.97 12 105.90 Name: Yamada B1: H2 C1: 2 Comment: ABC# 93, Seq# M397 Num H: 4 2 2.00 12 4.00 13 9.99 14 29.97 --------------- ---output1.txt----- Name: Tanaka A1:10.2 B1: H2 C1: 2 Comment: ABC# 61, Seq# M34 Num H: 3 12 37.97 13 105.90 14 203.82 Name: Suzuki A1:10.2 B1: H2 C1: 2 Comment: ABC# 58, Seq# M39 Num H: 2 11 37.97 12 105.90 Name: Yamada A1:10.2 B1: H2 C1: 2 Comment: ABC# 93, Seq# M397 Num H: 4 2 2.00 12 4.00 13 9.99 14 29.97 -----------------

  • 同じ文字列は行を合わせたい

    A列からB列に文字列があります。(日によって記入されている列は変動します。) A,B,C列それぞれの2行目から記入されている文字列を 同じ文字列は同じ行にし、それ以外の文字列はその他の行にしたいのですが どのようにすればよろしいでしょうか? エクセル2010で関数または、VBAで方法がございましたら、ご教示ください。 よろしくお願いします。

  • A列に特定の文字と数字があればその行を削除

    A列には大半が文字が入力されており特定の文字"自分"と一部数字があればその2,3,4行を削除し以下のように行を詰めたいのですがどなたかVBAコードの解る方お願いします。   A  B  C    1 鈴木 あ い     2 自分 う え       3 123 お あ    4 368 え う 5 江藤 え う    ↓   A  B  C 1 鈴木 あ い 2 江藤 え う

  • VBAで検索して、行をコピー&追加したい

    Excel2010で以下のことをしたいのですが、VBAがあまりできないのでやれません。 どうか助けてください。 ・sheet1のA列に検索用の番号(例として商品番号)が入力されています。 ・sheet2はデータベースで、A列に商品番号B列に商品名、C列に国名、D列に価格・・~その後J列まで情報が入っています。(行数は1万行) ・sheet1に入っている商品番号でデータベースから行をピックアップし、該当の行をsheet1のB列以降にコピーしたいのです。 (シート3を新しく作っても構いません。やりやすい方で) ・ただし、同じ商品番号で複数の行がヒットしますので、複数の行がヒットしたら行を追加しながら、行をコピーしたいです。 どのように書いたら良いか参考になるURLだけでもご教授ください。 よろしくお願いします。

  • EXCEL VBA 条件による空白挿入

    EXCEL2003を使っています。 以下のように列FGHが空白の行については列ABCを空白を挿入したいのですが数万行あり処理をVBAで自動化したいです。どなたかお力をお貸し下さい。お願いします。 A B C D E F G H 1 1 2 3 4 5 6 7 8 2 1 2 3 4 5 _ _ _ 3 1 2 3 4 5 6 7 8 4 1 2 3 4 5 _ _ _ 5 1 2 3 4 5 6 7 8 ↓ A B C D E F G H 1 1 2 3 4 5 6 7 8 2 _ _ _ 1 2 3 4 5 3 1 2 3 4 5 6 7 8 4 _ _ _ 1 2 3 4 5 5 1 2 3 4 5 6 7 8

専門家に質問してみよう