VBAエクセル列の並び替え

このQ&Aのポイント
  • VBAエクセルで列の並び替えを行う際にエラーが出る問題について教えてください。
  • マクロを使用して、ABC以外の文字が入っている列を削除する処理を組んだのですが、範囲を設定するとエラーが出ます。
  • なぜこのエラーが発生するのか、解決方法を教えてください。
回答を見る
  • ベストアンサー

VBA エクセル 列の並び替え

左から右にA、B、Cと値が入っています。 ABC以外の文字が列に入っていたら、削除するというマクロを組みましたが、範囲を設定するところでエラーが出てしまいました。 なぜでしょうか? 教えて下さい。 Sub arrange() Dim rg As Range Dim i As Long i = 1 Do rg = Cells(i, 1) If rg <> "A" And rg <> "B" And rg <> "C" Then Range(i & ":" & i).Delete End If i = i + 1 Loop Until (i & "1") = "" End Sub

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

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

できるだけご質問のマクロを生かしてみると。 sub macro1()  dim c as long  dim x as variant  for c = range("IV1").end(xltoleft).column to 1 step -1   x = cells(c, 1)   if x <> "A" and x <> "B" and x <> "C" then    cells(c, 1).delete shift:=xlshifttoleft   end if  next c end sub

vitaminQQ
質問者

お礼

行も列も勘違いし、更に題名もいまいちな質問に回答して頂きありがとうございます。 解決しました。 回答を書いて頂き感謝しております。 元々ループで行う必要は無かったんですね。 自分が考えていたよりも、なんだか大変そうですが、知識を増やす為にも、削除後の列の並び替えを行いたいのですがなんとか構文考えてみます。ありがとうございました。 ちなみに私が削除したかったのは、行でした、、、。

その他の回答 (5)

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.6

>エラーが出てしまいました。なぜでしょうか?  ⇒Dim rg As Rangeはオブジェクト、rg = Cells(i, 1)はValueなのでデータ型不一致      その他、気になる点です。    (1)データ構成によって削除できない行があります(削除時、変数iは加算?)    (2)Loop Until (i & "1") = ""では無限ループです    (3)Ifの判定条件に<>とAndの組み合わせは判り辛い    (4)DeleteメソッドはRowsオブジェクトの方がすっきりします   因みに変数定義ですが、プロでないのならば省略する方が楽です。   但し、データの型は十分理解して下さい。         

vitaminQQ
質問者

お礼

データ型省略できるんですね、、。 そんな事も知りませんでした。 (3)番が気になるので調べようと思いました。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

エクセルで行を削除したら、例えば第3行目を削除したら、本来第4行目のデータが第3行目に上がってくる。すると 行番号のCells(i,”A”)のiのデータが思っていたものと違うものになる。i+1すると上がってきた行は判別対象からもれるだろう。 こんなことはVBAでDELETEをやると、直ぐ経験することだ。 だから行削除したい場合は最下の行から上の行に向かって処理するのが常套的手法と思う。 質問者が経験不足なだけ。 参考 最下行は Sub test01() d = Range("A65536").End(xlUp).Row MsgBox d End Sub 下からの処理は For i=2 to d step -1など。

vitaminQQ
質問者

お礼

行の削除が実は少し考えなければならない処理だと知りませんでした。 最終行から削除を進めなければならないんですね。 参考になりました。

noname#158634
noname#158634
回答No.3

あ、一つ忘れてた。 初心者のうちはプロパティは明示するように。 rgじゃなくてrg.Value <> "A"とすること。

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.2

なぜでしょうね。 これから、エラーが出るたびに、人に聴くのですか? エラーの内容について、調べてみましたか? http://excelvba.pc-users.net/fol2/2_5.html で。セルの削除について勉強しなおしてください。 Loop Until の条件もおかしいですね。

vitaminQQ
質問者

お礼

今回質問した時に前回よりも時間をかけずに質問をしたのが、見抜かれてしまった!?と思いました。 教えて頂いたHP参考にします。ありがとうございます。

noname#158634
noname#158634
回答No.1

「範囲を設定」ってなに? rg = Cells(i, 1) のことなら、set。

参考URL:
https://www.google.com/search?q=vba+%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%9E%8B
vitaminQQ
質問者

お礼

夜遅く、回答ありがとうございました。 自分が何の知識も無い事を再認識しましたので、教えて頂いたHP含めもう一度勉強します。 本を買ってみましたが、どの本が知識を増やせるのかわかりませんね、、。 私が買った本は、逆引き辞典600ですが、個人のエクセルマクロのHPはそれ以上ためになります。

関連するQ&A

  • エクセルVBAの繰り返し処理の質問

    C列にある項目とG列にある項目を比較して、 一致し、H列にある数字が10以上ならば、B列にフラグ1を立てる という処理を行いたいんですが、 下記ぐらいまでしか作れず、うまくいきません・・・ Sub フラグを立てる処理() Dim i As Integer Dim j As Integer Dim k As Integer i = 1 j = 1 Do j = j + 1 Do i = i + 1 If Cells(j, 8) > 9 Then Cells(i - 1, 4) = 1 End If Loop Until Cells(i, 3) <> Cells(j, 7) Or Cells(i, 3) = "" Loop Until Cells(j, 7) = "" End Sub わかる方がいらっしゃいましたら、お願いします。

  • エクセルVBA

    A列を基準にBC列が空白ならAの数値を入れて、A>BならB列を更新、A<CならC列を更新 A列が数値以外ならその行をスキップ、という処理をしたいのですが Option Explicit Dim A As Range, B As Range, C As Range Dim i As Long Sub test() For i = 1 To 10 Set A = Cells(i, 1) Set B = A.Offset(0, 1) Set C = A.Offset(0, 2) If IsNumeric(A) Then Else Exit Sub End If If B.Value = "" Then B.Value = A.Value If C.Value = "" Then C.Value = A.Value If A.Value > B.Value Then B.Value = A.Value If A.Value < C.Value Then C.Value = A.Value Next i End Sub とすると数値以外の行の時点で停止してしまいます。 その行を飛ばして次の行に進むにはどうしたらいいのでしょうか?

  • エクセルVBAでConsolidate

    以下は、ネット検索で見つけたサンプルコードです。 同じフォルダ内の全ブックのSheet1のA1:B10をThisWorkbookのSheet1に統合しています。 Sub test2() Dim MyFile As String, MyPath As String Dim SumFile() As Variant, i As Long MyPath = ThisWorkbook.Path & "\" MyFile = Dir(MyPath, vbNormal) Do Until MyFile = "" If MyFile <> ThisWorkbook.Name Then ReDim Preserve SumFile(i) 'A1からB10の値を変数に代入 SumFile(i) = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1:R10C2" i = i + 1 End If MyFile = Dir Loop If i = 0 Then MsgBox "データが有りません": Exit Sub Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile() End Sub 質問1 Sheet1だけでなく全シートのA1:B10をThisWorkbookのSheet1に統合するためにはどう書き換えればよいのでしょうか? 質問2 上記コードではなぜ、ブックを開かずにデータがとれるのでしょうか?

  • エクセル2010のvbaについて

    Sheet1に挿入したイメージ(ActiveX)をクリックすると数字が上がって 実行中にもう一度同じイメージをクリックすると止まるようにしたいのですが 数字が上がったまま止まりません(上限はあるのでオーバーフローはしません) Worksheet_SelectionChangeで(ActiveXのイメージがもう一回押されて) 選択セルが変わったら停止としたかったのですが反応しません イメージをクリック(実行)してもう一回押すとクリックしている間は止まりますが離すと再開されます コードにクリックされた回数がわかるようにしましたが増えません 説明が分かりにくかったら追記します 回答お願いします クラスモジュールのコード(イメージの名前によって少し処理を変えるためです) Private Sub myImg_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim i As Integer, a, b, C As POINTAPI, obj As OLEObject i = myImg.Index - 1 Call GetCursorPos(C) Set obj = ActiveWindow.RangeFromPoint(C.X, C.Y) b = Range("A1") Range("A1") = obj.Name Range("A2") = Range("A2") + 1    'クリックされた回数が分かるようにするため追加 If Range("A2") = 2 Then Range("C1").Select End If Range("A3") = "B1" If obj.Name = 2 Then Range("A3") = "B3" Range(Range("A3")).Select End Sub Sheet1のコード Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Target.Address <> Range(Range("A3")).Address Then Exit Sub Do While ActiveCell < Range("A4") * 100 If ActiveCell.Address <> Range(Range("A3")).Address Then Exit Do End If DoEvents ActiveCell = ActiveCell + 1 Loop End Sub

  • ExcelにおけるVBAで、データの振り分けをしたい

    Sub a() Dim i As Long Dim s As Long Dim b As Worksheet Dim c As Worksheet Dim maxi As Long Dim maxs As Long Application.ScreenUpdating = False With ThisWorkbook Set b = .Worksheets("bbb") Set c = .Worksheets("ccc") End With maxi = b.Range("A1").CurrentRegion.Rows.Count maxs = c.Range("A1").CurrentRegion.Rows.Count For i = maxi To 2 Step -1 For s = maxs To 2 Step -1 If c.Cells(s, 1) = b.Cells(i, 1) And c.Cells(s, 2) = b.Cells(i, 2) Then c.Cells(s, 14) = b.Cells(i, 3) End If Next s Next i Application.ScreenUpdating = True End Sub ワークシートcとワークシートbの1列目と2列目が一致したときにだけ、cの14列目にbの3列目のデータを代入したく思い、以上のようなコードを書きましたが、重くて終わる様子がありません。 ・そもそもあっているのか、あっていないならどこを修正すればよいか ・早く終わるようにするにはどうしたらいいか アドバイスをよろしくお願いします。

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • VBAで教えてください。

    データがないときはExitSubしたいのですが、何処に記述すれば良いでしょうか? Sub 削除() Dim i As Long If MsgBox("データを削除します。よろしいですか?", vbYesNo) = vbYes Then Sheets("リスト").Select i = 5 Do Until i = 200 If Cells(i, 5).Value = Sheets("マスタ登録").Range("D5") Then Cells(i, 1).EntireRow.Delete End If i = i + 1 Loop Else Exit Sub End If End Sub

  • エクセルVBA

    Sub PlusA001() Dim a As Range Dim b As Integer Range("e1").Value = "氏名" Range("e2").Value = "甲" Range("e2").AutoFill Destination:=Range("e2:e10"), Type:=xlFillDefault Range("f1:j1").Value = Array("国", "数", "理", "社", "英") Set a = Range("f2") For i = 1 To 5 Do Until b = 9 a.Value = Int(100 * Rnd) + 1 b = b + 1 Set a = a.Offset(1, 0) Loop b = 0 Set a = a.Offset(-9, 1) Next i End Sub サンプルコードの例ですが、どうも実行しても納得できない部分があります。それはSet a=a.offset(-9,1)の部分です。Set a = Range("f2")においてf2を始点としているのは判りますが、f2からであればa=a.offset(-9、5) とすればいいのかと思い実行したのですが、ぐちゃぐちゃになります。なぜ(-9、5)ではなく(-9、1)何ですか?いくら読み解いても判りません。教えてください。

  • Excel VBAで文字列の部分一致の文字列を表示

    以前、こちらで頭5文字までの一致で文字列を表示するVBAを教えて頂きました。今回はFINDなどの部分一致での文字列を表示することをしたいのですが、ご教示いただけますと幸いです。 下記はSheet1のA3に文字を5文字以内いれるとSheet2のC列からピックアップしてSheet1のA列に文字列を表示する及びSheet2のB列のデータをSheet1のC列に表示させるVBAです。 Sub Test2() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim SData As String, i As Long, VRet As Variant Dim c As Range, LastRow As Long Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") SData = CStr(Ws1.Range("A3").Value) If SData = "" Then Exit Sub i = 5 LastRow = Ws1.Cells(Rows.Count, "A").End(xlUp).Row If LastRow < i Then LastRow = i End If Ws1.Range(Ws1.Cells(i, "A"), Ws1.Cells(LastRow, "C")).ClearContents With Ws2 For Each c In .Range(.Cells(1, "C"), .Cells(Rows.Count, "C").End(xlUp)) VRet = InStr(1, CStr(c.Value), SData, vbTextCompare) If VRet = 1 And Len(c.Value) >= 10 Then Ws1.Cells(i, "A").Resize(1, 2).Value = c.Resize(1, 2).Value 'とりあえずSheet2のB列のデータ(C列のデータに同期したデータ)をSheet1のC列に Ws1.Cells(i, "C").Value = .Cells(c.Row, "B").Value i = i + 1 End If Next End With End Sub 宜しくお願い致します。

  • excel vbaについてです

    VBA初心者で、暇な時にいろいろためしています。 以下のマクロを組んだのですが、エラーがでてうまくいきません。 どこがいけないのかご指摘願います。 Sub ather() Dim A As Range Dim B As Range Dim i As Integer With ThisWorkbook.Worksheets("Sheet1") For i = 1 To 30 Set A = Cells(i, 1) Set B = Cells(1, i) If Not .Range(A).Interior.ColorIndex = vbYellow Then GoTo port10 If Not .Range(B).Interior.ColorIndex = vbRed Then GoTo port10 .Range(B).Offset(, 1).Value = "○" port10: Next i End With End Sub イメージとしてはセルの塗りつぶしが黄色で、かつ右隣のセルの塗りつぶしが赤の時に、 赤色セルの右隣のセルに○を表示させようとしているのですが。。。 こうしたらいいんじゃない?といったアドバイスもお願いします(-人-)

専門家に質問してみよう