Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8733 / 13644 ツリー ←次へ | 前へ→

【31493】削除 yukko 05/11/23(水) 13:01 質問[未読]
【31494】Re:特定の値を削除 かみちゃん 05/11/23(水) 13:24 発言[未読]
【31495】Re:削除 ちくたく 05/11/23(水) 13:27 回答[未読]
【31496】Re:削除 かみちゃん 05/11/23(水) 13:32 発言[未読]
【31497】Re:削除 ちくたく 05/11/23(水) 13:59 発言[未読]
【31498】Re:削除 Kein 05/11/23(水) 14:02 回答[未読]
【31499】Re:削除 Hirofumi 05/11/23(水) 14:02 回答[未読]
【31500】Re:削除 yukko 05/11/23(水) 16:43 お礼[未読]

【31493】削除
質問  yukko  - 05/11/23(水) 13:01 -

引用なし
パスワード
    こんにちはです。

エクセルに下記の様に数値が入力されてます。

    A列  B列
2行目 55.4 #FALSE#
3行目 54.4 #TRUE#
4行目 59.4 #FALSE#・





60000行

 B列に#TRUE#と入力されていたら、A列の数値とB列を削除したいのです。
結果的にB列に#FALSE#が入力されてるA列の数値のみをA列に残してしたいのです。
 結果としてこのようにしたいのですが。

    A列  B列
2行目 55.4 #FALSE#
4行目 59.4 #FALSE#
・      #FALSE#
・      #FALSE#
・      #FALSE#
・      #FALSE#
60000行
  
どなたか、お知恵をかして頂けないすか。

/yukko

【31494】Re:特定の値を削除
発言  かみちゃん  - 05/11/23(水) 13:24 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> B列に#TRUE#と入力されていたら、A列の数値とB列を削除したいのです。
>結果的にB列に#FALSE#が入力されてるA列の数値のみをA列に残してしたいのです。

削除ですか?値のクリアですか?
期待する結果を見る限り、「削除」ではなく、「値のクリア」に見えます。
いずれにしても、手作業でオートフィルタで#TRUE#を抽出して、抽出された行を
「削除」するか「値のクリア」をすればできます。
もし、マクロでしたいのならば、その作業を「マクロの記録」で記録してはいかがでしょうか?

【31495】Re:削除
回答  ちくたく  - 05/11/23(水) 13:27 -

引用なし
パスワード
   yukkoさん。
こんにちは。

コードを使用する前に、シートのコピーを作って、
バックアップしておくことをおすすめします。

Sub test()

  Dim i As Integer
  
  For i = Range("A65536").End(xlUp).Row To 1 Step -1
    If Range("B" & i) = "#TRUE#" Then Rows(i).Delete
  Next i

End Sub

【31496】Re:削除
発言  かみちゃん  - 05/11/23(水) 13:32 -

引用なし
パスワード
   ちくたく さん、yukkoさん、こんにちは。かみちゃん です。

>    If Range("B" & i) = "#TRUE#" Then Rows(i).Delete

以下の期待する結果を望んでいるならば、.Deleteしてはいけないと思ってます。

> 結果としてこのようにしたいのですが。
>
>    A列  B列
>2行目 55.4 #FALSE#
>4行目 59.4 #FALSE#  ← 3行目ではなく4行目のまま?

いずれにしても、そのあたりはyukkoさんがどうしたいのかによりますけど。

【31497】Re:削除
発言  ちくたく  - 05/11/23(水) 13:59 -

引用なし
パスワード
   かみちゃん さん
こんにちは。

>>If Range("B" & i) = "#TRUE#" Then Rows(i).Delete
>以下の期待する結果を望んでいるならば、.Deleteしてはいけないと思ってます。

ご指摘ありがとうございます。お恥ずかしい。
それでしたら、Rows(i).Clearですかね。
よくある質問だったので、何も考えずに答えてしまいました。

【31498】Re:削除
回答  Kein  - 05/11/23(水) 14:02 -

引用なし
パスワード
   いつものように、作業列に数式を入れて判定する方法です。"TRUE"の文字は
半角という前提にしています。全角なら数式のところを修正して下さい。

Sub MyRow_Cl()
  On Error Resume Next
  With Range("A2", Range("A65536").End(xlUp)).Offset(, 255)
   .Formula = "=IF(LEFT($B2,2)=""#T"",1,"""")"
   .SpecialCells(3, 1).EntireRow.ClearContents
   .ClearContents
  End With
  Range("A1").Activate
End Sub



【31499】Re:削除
回答  Hirofumi  - 05/11/23(水) 14:02 -

引用なし
パスワード
   こんななのかなあ?
Option Explicit

Public Sub RowsDelete()

  Dim i As Long
  Dim lngRows As Long
  Dim lngCount As Long
  Dim rngList As Range
  Dim vntData As Variant
  Dim strProm As String

'  Application.ScreenUpdating = False
  
  'データの左上隅を基準とする(列見出しが有る物とします)
  Set rngList = ActiveSheet.Cells(1, "A")
  With rngList
    'データ行数を取得
    lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row
    If lngRows <= 1 And .Value = "" Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    '削除フラグの列をKeyとして整列
    .Offset(1).Resize(lngRows, 2).Sort _
          Key1:=.Offset(, 1), Order1:=xlAscending, _
          Header:=xlNo, OrderCustom:=1, _
          MatchCase:=False, Orientation:=xlTopToBottom, _
          SortMethod:=xlStroke
    'B列データを配列に取得
    vntData = .Offset(1, 1).Resize(lngRows).Value
  End With
    
  'データ行数分繰り返し
  For i = 1 To lngRows
    'FalseからTrueに変わる位置を取得
    If vntData(i, 1) Then
      lngCount = i
      Exit For
    End If
  Next i
  Erase vntData
  
  With rngList
    '行削除
    .Offset(lngCount).Resize(lngRows - lngCount + 1).EntireRow.Delete
  End With
  
  strProm = "処理が完了しました"
  
Wayout:
  
  Application.ScreenUpdating = True
  
  Set rngList = Nothing
  
  MsgBox strProm, vbInformation
  
End Sub

【31500】Re:削除
お礼  yukko  - 05/11/23(水) 16:43 -

引用なし
パスワード
    みなさま、ありがとうございます。


/yukko

8733 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free