結合のループ処理のマクロについて

このQ&Aのポイント
  • 質問者は結合のループ処理のマクロを作成していますが、うまく機能していないようです。
  • マクロは、Sheet1のC列にデータがある場合、C列からF列までのデータをSheet2のC列に半角で結合するものです。
  • しかし、結合するときにエラーが発生しています。質問者はどこが問題か教えてほしいと思っています。
回答を見る
  • ベストアンサー

結合のループ処理のマクロ

すみません教えて下さい 以下の条件で動くマクロを作っているのですがうまくいきません (1)sheet1、c7以下にデーターが入っています最終データー行はその時によって違います (2)sheet1,c列にデーターがあれば、必ずf列までデータがあります 上記条件のもと 例:sheet1 c7にデータがある場合 c7~F7までのデータを sheet2のC7に半角で結合する 上記動作をC列のセルが空白になるまで繰り返す マクロを作成しましたがうまくいきません sheet2のセルへ値を結合するところでエラーが出ます どこが悪いのかご教授、ご指導をお願いします  Sub loop1() ' ' 繰り返しMacro Macro ' ' Dim i As Integer i = 1 Sheets("Sheet1").Select Range("c7").Select Do While ActiveCell.Value <> "" Worksheets("Sheet2").Select Range("c7").Select Range("c7").Value = Asc.Sheet1!C7.Value & Sheet1!D7.Value & Sheet1!E7.Value & Sheet1!F7.Value i = i + 1 activesell.Offset(0.1).Select Loop End Sub

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

  • ベストアンサー
  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.5

既に、すばらしい回答が出ていますが、質問者の勉強という事で捕捉します。 Sheet1!C7.Value & Sheet1!D7.Value & Sheet1!E7.Value & Sheet1!F7.Value 関数の記述の仕方です。VBAのコードではありませんよ。 activesell.Offset(0.1).Select スペルミス、点とカンマ、行と列の指定の間違い Activeなセルを一行ずつ下へずらすには ActiveCell.Offset(1, 0).Activate と記述します。 Do while を使ったLoopですが、出来るだけ今のコードを生かすとして Sub loop1() Dim i As Integer i = 7 Sheets("Sheet1").Range("c7").Select Do While ActiveCell.Value <> "" Worksheets("Sheet2").Range("c" & i).Value = Range("c" & i).Value i = i + 1 ActiveCell.Offset(1, 0).Activate Loop End Sub となります、セルの結合と半角への変換は無視しています。 まずは、これだけで、何を行っているかいるか理解してみてください。

y-kazu1962
質問者

お礼

親切なご指導ありがとうございます。

その他の回答 (4)

回答No.4

こんにちは。 ご質問のコードを見る限りは、まだ掲示板で質問する段階にはないように思います。 まず、VBEditor に書いてみて、赤い字が出た所を修正するようにしなければなりませんね。また、デバッグ--コンパイルをしたら、エラーが出ていないとか確認してください。 できるだけ、基本的な所を積み上げたほうがよいです。今の段階では、回答を貰っても、解説のないコードだけでは、全部は把握できないかもしれません。 '// Sub CombineData()  Dim ws2 As Worksheet  Dim LastRow As Long '最後の行  Dim i As Long  Dim v As Variant  Set ws2 = Worksheets("Sheet2")  With Worksheets("Sheet1")   LastRow = .Cells(Rows.Count, "C").End(xlUp).Row   For i = 7 To LastRow '7行目から    If .Cells(i, "C").Value <> "" Then     v = .Cells(i, "C").Value _        & .Cells(i, "D").Value _        & .Cells(i, "E").Value _        & .Cells(i, "F").Value     ws2.Cells(i, "C").Value = StrConv(v, vbNarrow) '半角    End If   Next i  End With  Set ws2 = Nothing End Sub

y-kazu1962
質問者

お礼

ありがとうございます

回答No.3

最後で間違った、、、ENDの直前、、、 (正) zSheet.Columns("C").AutoFit (誤) 省略

y-kazu1962
質問者

お礼

ありがとうございます

回答No.2

C列途中に空白がある場合、その行はスキップしている。Sheet1とSheet2の行位置は対応させているので、Sheet2の方を詰める場合は、nn = i、をコメントにする 最初にC列をクリアしている。問題があれば、zSheet.Columns("C").Clear、をコメントにする Option Explicit 'Sub loop1() Sub TheNextNew() Const xNum = 7 Dim i As Long Dim nn As Long Dim xLast As Long Dim xSheet As Worksheet Dim zSheet As Worksheet 'i = 1 'Sheets("Sheet1").Select Set xSheet = ThisWorkbook.Sheets("Sheet1") Set zSheet = ThisWorkbook.Sheets("Sheet2") zSheet.Columns("C").Clear xLast = xSheet.Cells(Rows.Count, "C").End(xlUp).Row 'xSheet.Range(Cells(7, "C"), Cells(xLast, "C")).Select 'Do While ActiveCell.Value <> "" nn = xNum For i = xNum To xLast 'Worksheets("Sheet2").Select 'Range("c7").Select 'Range("c7").Value = Asc.Sheet1!C7.Value & Sheet1!D7.Value & Sheet1!E7.Value & Sheet1!F7.Value If (xSheet.Cells(i, "C").Value <> Empty) Then nn = i zSheet.Cells(nn, "C").Value = StrConv(xSheet.Range("C" & i).Value & xSheet.Range("D" & i).Value & xSheet.Range("E" & i).Value & xSheet.Range("F" & i).Value, vbNarrow) nn = nn + 1 End If 'i = i + 1 'ActiveCell.Offset(0.1).Select 'Loop Next zSheet.Select zSheet.Rows(xNum).AutoFit End Sub

y-kazu1962
質問者

お礼

ありがとうございます。 大変勉強になりました。

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

>どこが悪い シート名、セル番地のマクロの書き方が全然デタラメです。 作成例: sub macro1()  dim r as long  dim c as long  for r = 7 to worksheets("Sheet1").range("C6556").end(xlup).row   worksheets("Sheet2").cells(r, "C").clearcontents   if worksheets("Sheet1").cells(r, "C") <> "" then    for c = 3 to 6     worksheets("Sheet2").cells(r, "C") = worksheets("Sheet2").cells(r, "C") & worksheets("Sheet1").cells(r, c)    next c   end if  next r end sub

y-kazu1962
質問者

お礼

詳しい解答ありがとうございます

関連するQ&A

  • マクロ 結合セルへ値のみ貼り付けるにはどうしたらよいでしょうか。

    マクロは初心者で、まだまだ勉強しているところです。 シート名「入出金履歴」のデータを顧客コードごとに分かれている別シートへデータを振り分けて貼り付ける、もしくは反映させたいのですが、貼り付け先のセルがシートの都合上、結合セルになっており、下記のマクロだと当然ながらエラーになってしまいます。結合セルをまず、解除してから貼り付けようと思ったのですが、うまくいかず、困っています。 コピー先の結合状態は、7行目から、列A:C、列D:E、列F:H と、3列になるように結合されています。結合されている行の終わりは、A:C(結合されている)列に「合計」の値が入っているセルの行、H列まで、3列になるよう結合されています。 解除する以外に、良い方法があれば是非教えていただきたいです。 よろしくお願いします。 Sub samplea() r1 = ActiveCell.Row r2 = r1 + Selection.Rows.Count - 1 Dim myRange As Range Dim s_no As String For i = r1 To r2 s_no = Cells(i, 2) Range(Cells(i, 4), Cells(i, 9)).Select Selection.Copy Sheets(Format(s_no)).Select Set myRange = Columns("a:c").Find(what:="合計") If myRange Is Nothing Then Debug.Print "Not Fount" Else myRange.Select Selection.End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlValues Application.CutCopyMode = False Sheets("入出金履歴").Select End If Next End Sub

  • エクセルで縦に隣接した同じ内容のセルを一括で結合するマクロ

    いつもお世話になっています。 選択中のセル内で、縦に隣接したセルが同じ内容(文章)の場合、一括して結合してくれるようなマクロはどうすれば良いでしょうか。 (ついでに文章の縦位置を中央にできれば・・) 以下のような感じです。 東京 A B  ⇒      A B 東京 C D  ⇒ 東京 C D 東京 E F  ⇒      E F 大阪 A B  ⇒ 大阪 A B エクセルの使用バージョンは2000です。 マクロ勉強中の同僚に教えてもらったのは以下のマクロですが、動作せず二人で首をひねっています。 どうかご教授よろしくお願いします。 -------------------------------------------- Sub Macro1() ' ' Macro1 Macro ' セルの結合 ' ' Keyboard Shortcut: Ctrl+q ' Dim i As Integer Dim j As Integer Application.DisplayAlerts = False i = 1 Do While Cells(i + 1, 2).Value <> "" j = 1 Do While Cells(i + 1, 3).Value = Cells(i + 1 + j, 3).Value Range(Cells(i + 1, 3), Cells(i + 1 + j, 3)).Merge j = j + 1 Loop i = i + j Loop Application.DisplayAlerts = True End Sub

  • PCのマクロについて

    Sub Macro1() ' ' Macro1 Macro ' ' ActiveCell.FormulaR1C1 = "○" Range("F5").Select End Sub Sub Macro2() ' ' Macro2 Macro ' ' ActiveCell.FormulaR1C1 = "●" Range("F5").Select End Sub こんな感じでマクロ入れたんですが図でわかると思うのですが4段目で確認未のボタンを押すと1段目のセルに選択が移動してしまいます。ボタンを押した際に最初に選択したセルから移動しないようにするにはどうすればよいですか?

  • マクロについて

    マクロでデータをクリアするコマンドボタンを作りました。でも、計算の答えがでなくなりました。 例えば、 A1:A10までの情報はクリアになります。 答えの“=SUM(A1:A10)”というCセルだけが前の情報のままになります。(Cセルはマクロに登録していません。) 全くのど素人で、マクロの登録も他の書類からコピーしてセルだけ変えました。 マクロの内容は、下記の通りです。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 ' Sub allclear() Application.Calculation = xlManual Range("D4").Value = "" Range("B6").Value = "" Range("B8").Value = "" Range("E11").Value = "" Range("E12").Value = "" Range("F11").Value = "" Range("B21").Value = "" Range("B23").Value = "" Range("B25").Value = "" Range("B27").Value = "" Range("B29").Value = "" Range("P5:P9").Value = "" Range("Q5:Q9").Value = "" Range("P15:P19").Value = "" Range("Q15:Q19").Value = "" End Sub よろしくおねがいします。(_ _)

  • データの入っている行だけを繰り返し処理マクロについて

    データの入っている行だけを繰り返し処理したく以下マクロ記述しましたが上手くいきません。宜しく御願いします。 E列に空白列を挿入。 E3に「月」と入力しE4にD4の年月日から年月だけを取り出すように組みたく下記記述したのですがエラーになってしまいました。 どのように記述したら良いでしょうか? ..A..B..C...D.........E.......F 1 2 3 * * * 納期 月    * 4 09.10/08  09.10 5    記 Sub 年月test() ' ' 年月test Macro ' マクロ記録日 : 2009/11/15 ユーザー名 : TH ' ' Columns("E:E").Select Selection.Insert Shift:=xlToRight Range("E3").Select ActiveCell.FormulaR1C1 = "月" ActiveCell.Characters(1, 1).PhoneticCharacters = "ツキ" Range("E4").Select Do Until ActiveCell.Offset(0, -1).Value = "" With ActiveCell .Value = .FormulaR1C1 = "=LEFT(RC[-1],5)" End With Loop End Sub

  • 2つのマクロを1つにしたい

    いつもお世話になっております。 今回もよろしくお願いいたします。 (1)14のシートがあるのですが、データーのある2から14までのシートを印刷する。 (2)上記のうち、c列のデーターで連続しているセルを結合する。 (1)と(2)を合わせて1つのマクロにしたいのですが、アクティブシート1つにしか(2)のマクロが動きません。 下記のコードの間違いを教えてください。 Sub 契約書目次印刷() Dim Sh As Worksheet Dim t As Long Dim i As Range t = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 'データーのあるシートだけ印刷 For Each Sh In Worksheets(Array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)) If Sh.Range("A2").Value <> "" Then '連続データーセル結合 For Each i In Range("C1:C" & t) If i.MergeArea(1).Value = i.Offset(1).Value Then Range(i.MergeArea, i.Offset(1)).Merge End If Application.DisplayAlerts = False Next i End If Sh.PrintPreview Next Sh End Sub

  • EXCELのマクロに関して

    vbaのマクロに関して質問があります。 マクロをどのように作ればよいでしょうか? マクロは以下のようになっています。sheet1以外(sheet2,sheet3など)に単語を入れて、sheet1でフラッシュ単語のようにするマクロです。これに付け加えたい内容があります。sheet1のセルにある値を入れれば、sheet1以外のシートのある特定の列をフラッシュ単語としてだしたいと考えています。シートと列を指定したいと考えています。 どのように付け足せばよいでしょうか? Sub sample() Dim i As Integer i = 1 Worksheets("sheet1").Activate Do Sheet1.Range("A1").Value = Sheet3.Range("b" & i).Value '1000で1秒,oで場所,sheet2の場所 Call Sleep(1000) DoEvents i = i + 1 Loop Until IsEmpty(Sheet3.Range("b" & i).Value) '1000で1秒,oで場所,sheet2の場所 End Sub

  • マクロを書き変えたいのですが、

    マクロを書き変えたいのですが、 現在使用してる 下記のマクロがあるのですが、 このマクロに Sheet1~Sheet18までの セル E12・E14・F14データーを消す式を足したいのですが、 どのように書いたらよいでしょうか? Sub 打ち出しデーター削除() ' ' 打ち出しデーター削除 Macro ' 打ち出しシートの時間・判定を クリアーにする。 ' ' Sheets("打 ち 込  用 ").Select Application.ScreenUpdating = False Selection.SpecialCells(xlCellTypeConstants, 1).Select Selection.ClearContents Sheets("★スタッフ一覧").Select Range("A1").Select End Sub あと シート数を指定しない場合も知りたいのです。 どなたか 力を貸してください。

  • excel2007マクロに関しまして

    excel2007マクロに関して不明な点があるので教えて頂きたいです。 シートが50枚ありそれぞれのシートのN列4~15行に対し そのシートのC列4~15行の値を60倍したものを記載したいのですが 下記入力内容中の Range("N " & j ).Select のところでRange メソッドの失敗が生じてしまいます。 その他にも不備があればご指摘頂きたいです。 宜しくお願いします。 Sub Macro6() ' ' Macro6 Macro ' Dim i, j As Integer For i = 1 To 50 With Sheets("ds1_" & i) Range("N3").Select ActiveCell.FormulaR1C1 = "Q(cum/m)" For j = 4 To 15 Range("N " & j ).Select ActiveCell.FormulaR1C1 = "=RC[-11]*60" Next j End With Next i End Sub

  • Excelのイベントマクロ

    Private Sub Worksheet_Activate()に関する質問です。 ワークシート1と2があるとします。 ワークシート1は普通のデータが記されており、それのソートを実行するマクロをMacro1、そのデータから重複したものを外してソートするマクロをMacro2とし、Macro1から呼び出してます。 今、シート2を開いたときは必ず、シート1でMacro1を実行するようにしたいのですが、以下のように記述すると、無限ループになってしまいうまくいきません。 どなたか、方法をお教えください。 Sheet2に記載したイベントマクロ Private Sub Worksheet_Activate() Sheets("Sheet1").Select Macro1 Sheets("Sheet2").Select End Sub 標準モジュールに記載したマクロ Sub Macro1() Dim team As Integer ActiveSheet.Unprotect ("pass") Range("A3:c18").Select Selection.Sort Key1:=Range("c3"), Order1:=xlAscending, Key2:=Range("A3") ,Order2:=xlAscending, Header:=xlNo,OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal team = Range("b1").Value ActiveSheet.PageSetup.PrintArea = "$A$3:$c$" + CStr(team + 2) Macro2 Range("A1").Select ActiveSheet.Protect ("pass") End Sub Sub Macro2() Range("i3:j18").ClearContents Range("i3").Select Selection.Consolidate Sources:="R3C6:R18C7", Function:=xlMax, TopRow:=False,LeftColumn:=True, CreateLinks:=False Range("i3:k18").Select Selection.Sort Key1:=Range("k3"), Order1:=xlAscending, Header:=xlNo,OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal Range("j3:j18").Select Selection.NumberFormatLocal = "0_);[赤](0)" End Sub

専門家に質問してみよう