Excel VBA質問箱 IV

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

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


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

【33639】findメソッドについて TOTO 06/1/17(火) 12:04 質問[未読]
【33642】Re:findメソッドについて Jaka 06/1/17(火) 12:29 発言[未読]
【33643】Re:findメソッドについて TOTO 06/1/17(火) 13:05 質問[未読]
【33645】Re:findメソッドについて じゅん 06/1/17(火) 13:11 回答[未読]
【33650】Re:findメソッドについて じゅん 06/1/17(火) 15:30 回答[未読]
【33656】Re:findメソッドについて TOTO 06/1/17(火) 18:11 質問[未読]
【33657】Re:findメソッドについて じゅん 06/1/17(火) 18:20 回答[未読]
【33663】Re:findメソッドについて TOTO 06/1/17(火) 20:05 お礼[未読]
【33739】Re:findメソッドについて TOTO 06/1/19(木) 18:51 質問[未読]
【34106】Re:findメソッドについて じゅん 06/1/26(木) 13:56 回答[未読]
【34118】Re:findメソッドについて TOTO 06/1/26(木) 20:00 お礼[未読]
【33646】Re:findメソッドについて Jaka 06/1/17(火) 13:29 発言[未読]
【33664】Re:findメソッドについて TOTO 06/1/17(火) 20:06 お礼[未読]
【33659】Re:findメソッドについて Statis 06/1/17(火) 19:25 回答[未読]
【33666】Re:findメソッドについて TOTO 06/1/17(火) 20:13 発言[未読]
【33667】Re:findメソッドについて Statis 06/1/17(火) 20:19 回答[未読]
【33671】Re:findメソッドについて Hiro 06/1/17(火) 21:10 質問[未読]
【33672】Re:findメソッドについて Statis 06/1/17(火) 21:19 回答[未読]
【33720】Re:findメソッドについて Hiro 06/1/18(水) 21:49 お礼[未読]
【34093】Re:findメソッドについて TOTO 06/1/26(木) 11:15 質問[未読]
【34097】Re:findメソッドについて Statis 06/1/26(木) 11:38 回答[未読]
【34100】Re:findメソッドについて TOTO 06/1/26(木) 11:53 お礼[未読]

【33639】findメソッドについて
質問  TOTO  - 06/1/17(火) 12:04 -

引用なし
パスワード
     A  B  C
1 250  5  
2 251  8  ◇
3 252  3
4 253  6  ◇
5 254  1  ◇
6 255  0 

上記の表のrange("A1:C6)を指定し、C列に◇のある行のA列B列C列の値を
Deleteし(行削除は不可)、A列を基準にソートをかける

ということをやろうとしています。
行は変動しますが、列は毎回3列です。
Dim c As Range
Dim hanni As String
hanni = Range("A1" , Range("A65536").End(xlup)).Resize(, 3)

Set c = hanni.Find("◇".Value,)
この先、◇の左2列のデータをDeleteするoffset?辺りがわからず
つまずいています。
どうぞよろしくお願いします。

【33642】Re:findメソッドについて
発言  Jaka  - 06/1/17(火) 12:29 -

引用なし
パスワード
   Findメソッドの書き方使いか他等はヘルプに載っているのでそちらを見ていただくとして、

Findで見つかった場合、Cにセルそのものがセットされますから、
こんな感じ
Set C = range("A1")
cを基準にしてづらせばいいです。
c.offset(x,v)

因みに
>Deleteし(行削除は不可)
Deleteは、削除です。

【33643】Re:findメソッドについて
質問  TOTO  - 06/1/17(火) 13:05 -

引用なし
パスワード
   JAKAさま

ありがとうございます。
Cを基準にした時のoffsetの定義は
Cから見たBは、offset(-1,0)
Cから見たAは、offset(-2,0)

ですか?

そこがわからなかったのです。
レベル低くてすいません。

【33645】Re:findメソッドについて
回答  じゅん  - 06/1/17(火) 13:11 -

引用なし
パスワード
   ▼TOTO さん:

Public Sub FindDeleteSort()
  Dim i As Long
  
  For i = 1 To 65536
    If Cells(i, "C").Value = "◇" Then
      Rows(i).Value = ""
    End If
  Next i
End Sub

こんな感じですか?

【33646】Re:findメソッドについて
発言  Jaka  - 06/1/17(火) 13:29 -

引用なし
パスワード
   >Cを基準にした時のoffsetの定義は
>Cから見たBは、offset(-1,0)
>Cから見たAは、offset(-2,0)
>ですか?

>>offset?辺りがわからず
って事だったんで、Offsetでづらすって書いたけど、
見つかったCのセルがC列固定なら、づらす位置も固定されているからかまわないと思います。
でも検索範囲は、
hanni = Range("A1" , Range("A65536").End(xlup)).Resize(, 3)
ですよね!

AからCれつ全部固定なら...。
Cells(c.row,1).resize(,3) とか...。

【33650】Re:findメソッドについて
回答  じゅん  - 06/1/17(火) 15:30 -

引用なし
パスワード
   すみません、ソートが抜けてました・・・

Public Sub FindDeleteSort()
  Dim i As Long
  
  For i = 1 To 65536
    If Cells(i, "C").Value = "◇" Then
      Rows(i).Value = ""
    End If
  Next i
  
  Range("A1:B65536").Sort key1:=Range("A1"), order1:=xlAscending, header:=xlNo
End Sub

C列に◇がある場合、その行を空白にし、
A列を基準に「昇順」にソートしています。
※今回、全体が並べ替えの対象になっています
(1列目を見出しにする場合は、header:=xlYesとして下さい

【33656】Re:findメソッドについて
質問  TOTO  - 06/1/17(火) 18:11 -

引用なし
パスワード
   じゅんさま
ありがとうございます!
できました。が、あのすみません・・・
D列以降のデータも行単位で消えてしまいました。

C列が◇のときのA列とB列とC列のみを空白にしてA:Cの
データが入っている範囲のみのソートをA列を基準に行う、
という風にしたいと思います。

修行中のため、どこをいじればそうなるのかよくわかりません。

もしよければ、教えてください。

【33657】Re:findメソッドについて
回答  じゅん  - 06/1/17(火) 18:20 -

引用なし
パスワード
   ▼TOTO さん:
すみません、下記の処理によって、行全体が削除されてしまいます。
If Cells(i, "C").Value = "◇" Then
   Rows(i).Value = ""
End If

次のようにしてみて下さい。
Public Sub FindDeleteSort()
  Dim i As Long
  
  For i = 1 To 65536
    If Cells(i, "C").Value = "◇" Then
      'Rows(i).Value = ""
      Cells(i, "A").Value = ""
      Cells(i, "B").Value = ""
      Cells(i, "C").Value = ""
    End If
  Next i
  
  Range("A1:B65536").Sort key1:=Range("A1"), order1:=xlAscending, header:=xlNo
End Sub

【33659】Re:findメソッドについて
回答  Statis  - 06/1/17(火) 19:25 -

引用なし
パスワード
   ▼TOTO さん:
こんにちは

データがA、B、Cのみのデータとして

こんな方法も

Sub test()
With Range("A1", Range("A65536").End(xlUp)).Offset(, 255)
   .Formula = "=IF(C1=""<>"",1,"""")"
   .Value = .Value
   .SpecialCells(xlCellTypeConstants).EntireRow.ClearContents
   .ClearContents
End With
Range("A1", Range("B65536").End(xlUp)).Sort _
   key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo
End Sub

【33663】Re:findメソッドについて
お礼  TOTO  - 06/1/17(火) 20:05 -

引用なし
パスワード
   じゅんさま

完璧に成功しました。
わかりやすく教えて頂き本当にありがとうございました。

【33664】Re:findメソッドについて
お礼  TOTO  - 06/1/17(火) 20:06 -

引用なし
パスワード
   JAKAさま

とても参考になりました。
どうもありがとうございました。

【33666】Re:findメソッドについて
発言  TOTO  - 06/1/17(火) 20:13 -

引用なし
パスワード
   ▼Statis さん:

どうもありがとうございます。

>   .SpecialCells(xlCellTypeConstants).EntireRow.ClearContents
>   .ClearContents

ステップインでやっていきましたら、ここのところで
『該当するセルが見つかりません』とデバックになってしまいました。

A    B     C
7438    2    151
7444    1    153
7502    1    156
7504    1    157
7508    2    159
7509    1    160
7524    1    167
7526    1    168
8316    2    ◇
8501    1    
8502    1    ◇
8503    1    
8604    1    ◇
8702    1    

上記のデータに対して行ってみました。

【33667】Re:findメソッドについて
回答  Statis  - 06/1/17(火) 20:19 -

引用なし
パスワード
   こんばんは
Err処理を加えて

Sub test()
With Range("A1", Range("A65536").End(xlUp)).Offset(, 255)
   .Formula = "=IF(C1=""◇"",1,"""")"
   .Value = .Value
   On Error GoTo EndLen
   .SpecialCells(xlCellTypeConstants).EntireRow.ClearContents
   On Error GoTo 0
   .ClearContents
End With
Range("A1", Range("B65536").End(xlUp)).Sort _
   key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo
Exit Sub
EndLen:
 MsgBox "該当のセルがありませんでした。", vbInformation
End Sub

【33671】Re:findメソッドについて
質問  Hiro  - 06/1/17(火) 21:10 -

引用なし
パスワード
   ▼Statis さん:
今晩は。横からすみません。

Statisさんの素晴らしいコードを見させていただき、
質問させて頂いても宜しいでしょうか?
コードの3行目「.Formula = "=IF(C1=""◇"",1,"""")"」はどのように理解すればよいのでしょうか?
C列に◇のマークがあれば256行目に「1」無ければ「空白」ということでしょうか?
更にOn Error GoTo EndLenはどういう意味なんでしょうか。
お時間許せば解説いただけませんでしょうか。


>Sub test()
>With Range("A1", Range("A65536").End(xlUp)).Offset(, 255)
>   .Formula = "=IF(C1=""◇"",1,"""")"
>   .Value = .Value
>   On Error GoTo EndLen
>   .SpecialCells(xlCellTypeConstants).EntireRow.ClearContents
>   On Error GoTo 0
>   .ClearContents
>End With
>Range("A1", Range("B65536").End(xlUp)).Sort _
>   key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo
>Exit Sub
>EndLen:
> MsgBox "該当のセルがありませんでした。", vbInformation
>End Sub

【33672】Re:findメソッドについて
回答  Statis  - 06/1/17(火) 21:19 -

引用なし
パスワード
   こんばんは

>C列に◇のマークがあれば256行目に「1」無ければ「空白」ということでしょうか?
その通りです。
>更にOn Error GoTo EndLenはどういう意味なんでしょうか。
Err処理です。
>.SpecialCells(xlCellTypeConstants).EntireRow.ClearContents
256行目に値(1)が無ければErrが出ます。
そこでErrが出た場合 EndLenに飛ぶようにしています。

【33720】Re:findメソッドについて
お礼  Hiro  - 06/1/18(水) 21:49 -

引用なし
パスワード
   ▼Statis さん:
今晩は。
良く理解できました。
ありがとうございました。

【33739】Re:findメソッドについて
質問  TOTO  - 06/1/19(木) 18:51 -

引用なし
パスワード
   ▼じゅん さま:

    Y     Z     AA     
130 7518    2    164
131 7524    1    167
132 7528    3    169
133 7536    1    171
134 8314    1    ◇
135 8318    1    ◇
136 8501    3    
137 8505    1    
138 8604    1    
139 8702    3    
140 8704    2    

このようにA1からデータが入っていない時に
下記のコードはどのように手を加えればよろしいのでしょうか。
この場合は、Y130:AA140にデータが入っています。
対象の範囲を
Dim hanni As Range
hanni = Range("Y130", Range("Y65536").End(xlUp)).Resize(, 3)
として範囲内のデータについて◇の入った行のY,Z,AAを消し、
範囲内のみをY130:AA140(いくつかデータは消えている)Y列を基準に
ソートをかける、という風にしたいと思います。

何度も申し訳ありません。
よろしくお願い致します。

>次のようにしてみて下さい。
>Public Sub FindDeleteSort()
>  Dim i As Long
>  
>  For i = 1 To 65536
>    If Cells(i, "C").Value = "◇" Then
>      'Rows(i).Value = ""
>      Cells(i, "A").Value = ""
>      Cells(i, "B").Value = ""
>      Cells(i, "C").Value = ""
>    End If
>  Next i
>  
>  Range("A1:B65536").Sort key1:=Range("A1"), order1:=xlAscending, header:=xlNo
>End Sub

【34093】Re:findメソッドについて
質問  TOTO  - 06/1/26(木) 11:15 -

引用なし
パスワード
   こんにちは
Statisさま

Sub testtest()
With Range("Y132", Range("Y65536").End(xlUp)).Offset(, 255)
   .Formula = "=IF(AA132=""◇"",1,"""")"
   .Value = .Value
   On Error GoTo EndLen
   .SpecialCells(xlCellTypeConstants).EntireRow.ClearContents
   On Error GoTo 0
   .ClearContents
End With
Range("Y132", Range("Z65536").End(xlUp)).Sort _
   key1:=Range("Y132"), Order1:=xlAscending, Header:=xlNo
Exit Sub
EndLen:
 MsgBox "該当のセルがありませんでした。", vbInformation
End Sub

データがY132:AA155にあるため、上記のようにアレンジさせて頂きました。
A1:C30にデータを置いて、教えて頂いたコードを実行すると完璧に処理されましたが、
私がアレンジした上記のコードは
With Range("Y132", Range("Y65536").End(xlUp)).Offset(, 255) ←ここで
アプリション定義またはオブジェクト定義のエラーです
となります。

問題点を教えて頂けたらと思います。
よろしくお願い致します。

【34097】Re:findメソッドについて
回答  Statis  - 06/1/26(木) 11:38 -

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

Offset プロパティを調べてみて下さい。
最初A列を対象としていましたので
「Offset(, 255)」でIV列を示します。
Y列を対象とした場合IV列を示すには
「Offset(, 231)」となります

簡単に説明しますと
A列は1列目ですIV列は256列目となります。
Range("A1").Offset(,1)でB1を示します。
Range("A1").Offset(, 255)でIV1を示します。
なのでRange("Y1").Offset(,231)でIV1を示します。

【34100】Re:findメソッドについて
お礼  TOTO  - 06/1/26(木) 11:53 -

引用なし
パスワード
   ▼Statis さん:
>こんにちは
>
>「Offset(, 231)」となります
>
これに直したら成功しました。
バカな質問をしてすみませんでした。

非常にわかりやすい解説を本当にどうもありがとうございました。

【34106】Re:findメソッドについて
回答  じゅん  - 06/1/26(木) 13:56 -

引用なし
パスワード
   ▼TOTO さん:
お返事おそくなって、すみません。
見逃しておりました・・・
(既に解決されていた場合は、無視して下さい)

前回、私が記載致しましたプログラムを(無理矢理)利用すると
Public Sub FindDeleteSort_Ver2()
  Dim i As Long
  Dim FindRow As Long

  For i = 1 To 65536
    If Cells(i, "A").Value <> "" Then
      '1行目から見ていって何か入っていたら、その行からソート対象にする
      FindRow = i
      Exit For
    End If
  Next i
  
  For i = FindRow To 65536
    If Cells(i, "C").Value = "◇" Then
      'Rows(i).Value = ""
      Cells(i, "A").Value = ""
      Cells(i, "B").Value = ""
      Cells(i, "C").Value = ""
    End If
  Next i
 
  Range("A" & FindRow & ":B65536").Sort key1:=Range("A1"), order1:=xlAscending, header:=xlNo
End Sub
こんな感じになりますでしょうか。
列の指定も前回同様ですので、今回用に変更する必要がありますが。。

また、上と同様のプログラムを改良すると、下記のような感じ
になります。
Public Sub NewFindDeleteSort()
  Dim strSelectRange As String
  
  strSelectRange = ActiveSheet.UsedRange.Address
  Range(strSelectRange).Sort key1:=Range("A1"), order1:=xlAscending, header:=xlNo
End Sub
(あえて、セル範囲を変数に入れていますが、直接書かれても、もちろんOKです)

【34118】Re:findメソッドについて
お礼  TOTO  - 06/1/26(木) 20:00 -

引用なし
パスワード
   じゅんさま
お返事どうもありがとうございました。

解説付きでとても助かりました。
じっくり勉強しながら、引用させて頂きます!

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