エクセルマクロ:チェックボックスコピー2エラー解決策

このQ&Aのポイント
  • エクセルマクロにおいて、データ量やチェックボックスの数を増やすとエラーが発生する問題について解決策を教えてください。
  • シート1には25000行のデータがあり、行数は変動することもあります。シート2には20個のチェックボックスとコマンドボタンがあります。質問者は、17個までのチェックボックスで正常にコピーができましたが、18個目からエラーが発生しています。
  • 質問者は上記のマクロで、チェックボックスを選択すると対応するセルの範囲をコピーしてシート3に貼り付ける処理を行っています。しかし、チェックボックスの数が増えるとエラーが発生してしまいます。解決策を教えてください。
回答を見る
  • ベストアンサー

エクセル マクロ:チェックボックス コピー2

昨日質問し、解決したと思ったのですが、データ量とチェックボックスの数を増やしたら エラーが出てしまいました。解決策を教えてください。 sheet1にはデータがあり行数は25000です。(行数は変動で行数MAXだったりもします) sheet2にはチェックボックス20個とコマンドボタンがあります。 下記のマクロでは17個までチェックしてもコピー出来ましたが、18個目からエラーが出ました。 よろしくお願い致します。 Private Sub CommandButton1_Click() Dim myrange As String Dim rmax As Long rmax = Sheets("sheet1").Range("B1").End(xlDown).Row With Sheets("sheet2") If .CheckBox1 Then myrange = myrange & ",$B$1:$B$" & rmax If .CheckBox2 Then myrange = myrange & ",$C$1:$C$" & rmax If .CheckBox3 Then myrange = myrange & ",$D$1:$D$" & rmax If .CheckBox4 Then myrange = myrange & ",$E$1:$E$" & rmax If .CheckBox5 Then myrange = myrange & ",$F$1:$F$" & rmax If .CheckBox6 Then myrange = myrange & ",$G$1:$G$" & rmax If .CheckBox7 Then myrange = myrange & ",$H$1:$H$" & rmax If .CheckBox8 Then myrange = myrange & ",$I$1:$I$" & rmax If .CheckBox9 Then myrange = myrange & ",$J$1:$J$" & rmax If .CheckBox10 Then myrange = myrange & ",$K$1:$K$" & rmax If .CheckBox11 Then myrange = myrange & ",$L$1:$L$" & rmax If .CheckBox12 Then myrange = myrange & ",$M$1:$M$" & rmax If .CheckBox13 Then myrange = myrange & ",$N$1:$N$" & rmax If .CheckBox14 Then myrange = myrange & ",$O$1:$O$" & rmax If .CheckBox15 Then myrange = myrange & ",$P$1:$P$" & rmax If .CheckBox16 Then myrange = myrange & ",$Q$1:$Q$" & rmax If .CheckBox17 Then myrange = myrange & ",$R$1:$R$" & rmax If .CheckBox18 Then myrange = myrange & ",$S$1:$S$" & rmax If .CheckBox19 Then myrange = myrange & ",$T$1:$T$" & rmax If .CheckBox20 Then myrange = myrange & ",$U$1:$U$" & rmax End With If myrange = "" Then MsgBox "チェックしてください" Exit Sub End If myrange = "$A$1:$A$" & rmax & myrange Sheets("sheet1").Range(myrange).Copy Sheets("sheet3").Range("A1").PasteSpecial xlPasteValues Sheets("sheet3").Select End Sub

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

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

文字列が長すぎるだけです。 private sub CommandButton1_Click()  dim res as range  dim rmax as long  dim i as integer  dim flg as boolean  rmax = worksheets("Sheet1").range("B1").end(xldown).row  set res = worksheets("Sheet1").range("A1:A" & rmax)  for i = 1 to 20   if worksheets("Sheet2").oleobjects("CheckBox" & i).object.value then    set res = union(res, worksheets("Sheet1").range("A1:A" & rmax).offset(0, i))    flg = true   end if  next i  if not flg then  msgbox "NO CHECK"  exit sub  end if  res.copy  worksheets("Sheet3").range("A1").pastespecial paste:=xlpastevalues  worksheets("Sheet3").select end sub

meina04
質問者

お礼

いつもご回答ありがとうございます。 動作も良好で大変助かりました。 今度ともご指導よろしくお願い致します。

その他の回答 (1)

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

まぁ、通常は半角で255文字までですから、文字数オーバーで間違いなさそうですね。 ご本人ご提示のコードを最大限生かすなら・・ Private Sub CommandButton1_Click() Dim myrange As String 'Dim rmax As Long '不要? 'rmax = Sheets("sheet1").Range("B1").End(xlDown).Row With Sheets("sheet2") If .CheckBox1 Then myrange = myrange & ",B:B"    (中略) If .CheckBox20 Then myrange = myrange & ",U:U" End With If myrange = "" Then MsgBox "チェックしてください" Exit Sub End If myrange = "A:A" & myrange Sheets("sheet1").Range(myrange).Copy Sheets("sheet3").Range("A1").PasteSpecial xlPasteValues Sheets("sheet3").Select End Sub こんな風に、列全体をコピーするようにして、文字数を減らしてやれば良いんじゃないでしょうか? 正直、変数rmaxの存在意義を感じ取れません。 「最大行までコピーするなら列全体をコピーしても結果は同じ」です。 例えば「B列で見ている最終行よりもC列の方が多いケースがある」、 と言うなら必要かもしれませんが、それが無いのであれば、これは無意味です。 仮にそれがあったとしても、それならそれで 「sheet3に貼り付けた後に、取得した最大行以下を削除」 してやれば結果は同じですね。 例えば     Sheets("sheet3").Rows(rmax + 1 & ":" & Rows.Count).Delete こんな感じのものを末尾に足してやればOKです。 やり方はいくらでもありますと言う事で、参考までに。

meina04
質問者

お礼

ご回答ありがとうございます。 コードをコピーして使わせて頂きましたが、改善前の場所と同じSheets("sheet1").Range(myrange).Copyのところでエラーがでてしまいました。 マクロ初心者なので原因は分からず、お返事が遅れて申し訳ございませんでした。 今後ともよろしくお願いします。

関連するQ&A

  • エクセル マクロ:チェックボックス コピー

    教えてください。 sheet1にデータがあり sheet2にチェックボックスとコマンドボタンがあります。 チェックボックスにレ点を入れ、コマンドボタンを押すと sheet1の該当する列をコピーして、sheet3に貼り付ける マクロを作ろうと思ってますがうまくいきません。 下記のマクロを使えるように手直ししていただけないでしょうか。 よろしくお願い致します。 Private Sub CommandButton1_Click() Dim myrange As String Dim rmax As Long rmax = Sheets("sheet1").Range("A2").End(xlDown).Row With Sheets("sheet2") If .CheckBox1 Then myrange = myrange & ",$B$1:$B$" & rmax If .CheckBox2 Then myrange = myrange & ",$C$1:$C$" & rmax If .CheckBox3 Then myrange = myrange & ",$D$1:$D$" & rmax End With If myrange = "" Then MsgBox "チェックしてください" Exit Sub End If myrange = "$A$2:$A$" & rmax & myrange Sheets("sheet1").Range(myrange).Copy Sheets("sheet3").Range("A1").PasteSpecial xlPasteValues Application.CutCopyMode = False Sheets("sheet3").Select End Sub

  • エクセル マクロ:チェックボックス コピー3

    前回、質問した件で、追加で質問させていただきます。 前回の質問は、sheet2のチェックボックスによって、sheet1の列をコピーして、sheet3にペーストするという内容でした。 keithin様からご回答いただき問題は解決しましたが、修正を加えなくてはならなくなりました。 sheet2のチェックボックスによってsheet1の列とsheet4の列をコピーして、sheet3にペーストしようと頑張りましたが、解決できそうにありません。 尚、sheet1とsheet4の行数は同じで、sheet1とsheet4のA列は同じ内容なので必要ありません。 下記が前回のベストアンサーです。 private sub CommandButton1_Click()  dim res as range  dim rmax as long  dim i as integer  dim flg as boolean  rmax = worksheets("Sheet1").range("B1").end(xldown).row  set res = worksheets("Sheet1").range("A1:A" & rmax)  for i = 1 to 20   if worksheets("Sheet2").oleobjects("CheckBox" & i).object.value then    set res = union(res, worksheets("Sheet1").range("A1:A" & rmax).offset(0, i))    flg = true   end if  next i  if not flg then  msgbox "NO CHECK"  exit sub  end if  res.copy  worksheets("Sheet3").range("A1").pastespecial paste:=xlpastevalues  worksheets("Sheet3").select end sub keithin様 無断で借用させていただきました。申し訳ございません。

  • エクセル マクロ チェックボックス

    sheet1にチェックボックスが3つあり、マクロを実行するコマンドボタンが1つあります。 チェックボックスにレ点を入れることにより、sheet4のデータからsheet2にグラフを作成しようと考えてますが、エラーが出てしまい解決できません。 どのように訂正したらいいのか教えて頂けないでしょうか。 Private Sub CommandButton1_Click() Dim GraphRange As String Dim Graph As ChartObject Dim lastRow As Long Set Graph = Sheets("sheet2").ChartObjects.Add(150, 27, 350, 200) lastRow = Sheets("sheet4").Range("A" & Rows.Count).End(xlUp).Row GraphRange = Sheets("sheet4").Range(Cells(1, 1), Cells(lastRow, 1)).Value If Sheets("sheet1").CheckBox1.Value = True Then 'CheckBox1にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 2), Cells(lastRow, 2)).Value End If If Sheets("sheet1").CheckBox2.Value = True Then 'CheckBox2にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 3), Cells(lastRow, 3)).Value End If If CheckBox3.Value = True Then 'CheckBox3にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 4), Cells(lastRow, 4)).Value End If Graph.Chart.ChartWizard Source:=Sheets("sheet4").Range(GraphRange).Value, _ Gallery:=xlLine, Format:=1, PlotBy:=xlColumns, _ CategoryLabels:=1, SeriesLabels:=1, HasLegend:=True End Sub

  • エクセル チェックボックスの解除について(VBA)

    YES/NOを入力させる為の下記のVBAにおいて、チェックボックス1をチェックすると、アの部分でチェックボックス2の解除を行う関係で?、シート上でチェックボックス2を操作していないのにもかかわらず、勝手にCheckBox2_Click()に入り、命令文イを実行してしまいます。 ただ単にSub CheckBox1_Click()のルーチンの最後までの処理で終わりたいのですが、どうしたらよいのでしょうか。 Private Sub CheckBox1_Click() If CheckBox1 = True Then Sheets("sheet1").Range("A1") = 1 Sheets("sheet1").Range("A2") = 0 CheckBox2 = False・・・ア Else Sheets("sheet1").Range("A1") = "" End If End Sub Private Sub CheckBox2_Click() If CheckBox2 = True Then Sheets("sheet1").Range("A1") = 0 Sheets("sheet1").Range("A2") = 1 CheckBox1 = False Else Sheets("sheet1").Range("A2") = ""・・・イ End If End Sub

  • 【Excel VBA】チェックボックスの有無

    Excel2003を使用しています。 昨日、『チェックボックスの挿入位置』で質問させていただきましたが、その続きというか、もうひとつ条件を追加したく、改めて質問させていただきます。 Sheet2のN1セルに入力されている番号と同じ番号が入力されているセルをSheet1のA列(A11:A200)から探して、その行のB列にチェックボックスを挿入したく、下記のようにコードを書いています。 ---------------------------------------- Sub test2() Dim myStr As String Dim myRange As Range myStr = Sheets("Sheet2").Range("N1").Value Set myRange = Sheets("Sheet1").Range("A11:A200").Find(myStr) If myRange Is Nothing Then Exit Sub Else Sheets("Sheet1").OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, _ Left:=myRange.Offset(, 1).Left , Top:=myRange.Top , Width:=12, Height:=13).Select End If End Sub ---------------------------------------- それで、今回追加したい条件は、既に、チェックボックスが挿入されていた場合は、何もせずに処理を終えたいのです。 現在は、チェックボックスが挿入されていると、そのチェックボックスの上に新たに重なってしまいますので、そうならないようにできたらと思い、質問させていただきました。 よろしくお願いします。

  • 【Excel VBA】チェックボックスの挿入位置

    Excel2003を使用しています。 Sheet2のN1セルに入力されている番号と同じ番号が入力されているセルをSheet1のA列(A11:A200)から探して、その行のB列にチェックボックスを挿入したく、下記のようにコードを書いてみましたが、チェックボックスの挿入と挿入位置等(?部分)をどのように書いたらいいのかわかりません。 ---------------------------------------- Sub test1() Dim myStr As String Dim myRange As Range myStr = Sheets("Sheet2").Range("N1").Value Set myRange = Sheets("Sheet1").Range("A11:A200").Find(myStr) If myRange Is Nothing Then Exit Sub Else  '?←この部分がわかりません…。 End If End Sub ---------------------------------------- 実際にチェックボックスを挿入してマクロの記録もとってみたのですが、あまり参考にすることができず、質問させていただいた次第です。 チェックボックスは、コントロールツールボックスのチェックボックスを使用したいのですが…。 よろしくお願いします。

  • エクセルの簡単なマクロ機能を追加したいのです

    既存のエクセルマクロ(Sub チェック()以下です)に下記の内容のマクロを付け足したいです。 教えていただけないでしょうか。 付け足したい条件です:  Sheet2のC列に 0  があれば  Sheet1のB列に 愛 と([太字]でセルの背景色を[灰色25%]にして)入れたいです 恐れ入りますがご存じの方がいらっしゃりましたら教えていただきたく何卒よろしくお願いいたします。 ----------------------------------------------- Sub チェック() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c1 As Range Dim c2 As Range Dim myCt As Long Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Set myRange1 = Ws1.Range("A1", Ws1.Cells(Rows.Count, "A").End(xlUp)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(Rows.Count, "A").End(xlUp)) For Each c1 In myRange1 myCt = 0 For Each c2 In myRange2 If c2.Value = c1.Value Then If c2.Offset(, 1).Value = "" Then c1.Offset(, 1).Interior.ColorIndex = 3 Else c1.Offset(, 1).Value = c2.Offset(, 1).Value End If myCt = myCt + 1 End If Next c2 If myCt > 1 Then c1.Offset(, 1).Interior.ColorIndex = 10 Next c1 Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

  • ワークシート上のチェックボックスのチェックをカウント

    こんにちは EXCELのVBAに関する質問なのですが ワークシート上に配置したチェックボックス(コントロールツールボックス) で各シートのCheckbox1にチェックが入っている数を数えたいのですが 下記のように書いたところエラーが出ました。 何かよい改善案ご存知の方いらっしゃいませんか? よろしくお願いいたします。 Sub test() Dim myst As Worksheet Dim yes As Integer, myct As Integer myct = ThisWorkbook.Sheets.Count Worksheets.Add after:=Sheets(myct) Sheets(myct + 1).Name = "syuukei" For Each myst In Worksheets On Error GoTo elabel If ThisWorkbook.myst.CheckBox1.Value = True Then yes = yes + 1 End If elabel: Next with worksheets("syuukei") .range("a2")="YESの合計" .range("b2")=yes end with End Sub

  • エクセル マクロ エラー

    Sub 保存() Dim MySheetName As Variant MySheetName = InputBox("シート名を入力してください") If MySheetName = "" Then Exit Sub Sheets("1").Copy After:=Sheets(Worksheets.Count) ActiveSheet.Name = MySheetName Sheets("原本").Range("A1:K73").Copy Sheets("1原本").Range("A1") End Sub シートにグラフを乗せたらエラーが出たのですが 解除できないでしょうか?

  • エクセル マクロ 抽出

    教えてください。 ○と記入されたセルを参照して、一つ上のセル・A列にある同じ行のセル・ 9行目にある同じ列のセルを抽出しようとしています。 下記の通り入力すると 行数=値.Rowでエラーが出たしまいました。 試行錯誤頑張りましたが解決できそうにありませんのでお力を貸して頂けないでしょうか。 Sub 抽出() Dim i, 行数, 列数 As Long Dim 値 As Range i = 0 行数 = 値.Row 列数 = 値.Column For Each 値 In Sheets("sheet1").Range("C12:R171") If 値.Value = "○" Then i = i + 1 With Sheets("sheet2") .Cells(i, 3).Value = Sheets("sheet1").Cells(行数, 1).Value .Cells(i, 4).Value = Sheets("sheet1").Cells(9, 列数).Value .Cells(i, 5).Value = 値.Offset(-1, 0).Value End With End If Next End Sub

専門家に質問してみよう