Excel VBA質問箱 IV

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

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


6134 / 13645 ツリー ←次へ | 前へ→

【46982】条件つき列の並べ替え [46222]関連 さや 07/2/24(土) 16:20 質問[未読]
【46985】Re:条件つき列の並べ替え [46222]関連 かみちゃん 07/2/24(土) 17:37 発言[未読]
【46994】Re:条件つき列の並べ替え [46222]関連 さや 07/2/24(土) 18:41 お礼[未読]
【46995】Re:条件つき列の並べ替え [46222]関連 かみちゃん 07/2/24(土) 18:50 発言[未読]
【47005】Re:条件つき列の並べ替え [46222]関連 さや 07/2/24(土) 20:31 お礼[未読]
【47007】Re:条件つき列の並べ替え [46222]関連 かみちゃん 07/2/24(土) 21:39 発言[未読]
【47015】Re:条件つき列の並べ替え [46222]関連 さや 07/2/25(日) 4:38 質問[未読]
【47023】Re:条件つき列の並べ替え [46222]関連 かみちゃん 07/2/25(日) 15:01 発言[未読]
【47025】Re:条件つき列の並べ替え [46222]関連 さや 07/2/25(日) 18:20 お礼[未読]
【46991】Re:条件つき列の並べ替え [46222]関連 Hirofumi 07/2/24(土) 18:14 回答[未読]

【46982】条件つき列の並べ替え [46222]関連
質問  さや  - 07/2/24(土) 16:20 -

引用なし
パスワード
   いつもお世話になっています。
今回は以下のようなコードを考えています。

1.C列に日付が昇順で表示される。日付の個数は様々(同じ日付の個数はいくつに   なるかわからない)。
2.D列以外は昇順で表示される。
3.D列に3桁の数値がランダムに表示される。
4.最優先されるキーをD列として(昇順)、A列からO列までを並べ替える。

*条件・・・常にC列における最新の日付けの行を選択。下記の例では2007/2/3が 該当する。つまり、7行から15行が該当しA7〜O15を並べ替えたい。
   
●イメージ
<マクロ実行前>
       A  B   C     D・・・・・・・O
 1    1      2007/1/31   185
 2    2      2007/1/31   187
 3    3      2007/2/1   169
 4    4      2007/2/2   171
 5    5      2007/2/2   170
 6    6      2007/2/2   190
 7    7      2007/2/3   188
 8    8      2007/2/3   179
 9    9      2007/2/3   187
10    10      2007/2/3   179
11    11      2007/2/3   177
12    12      2007/2/3   177
13    13      2007/2/3   165
14    14      2007/2/3   975
15    15      2007/2/3   188
16
17
18
19
20

<マクロ実行後>
      A  B   C      D・・・・・・・・O
 1    1     2007/1/31   185
 2    2     2007/1/31   187
 3    3     2007/2/1    169
 4    4     2007/2/2    171
 5    5     2007/2/2    170
 6    6     2007/2/2    190
 7    13     2007/2/3    165
 8    11     2007/2/3    177
 9    12     2007/2/3    177
10    8     2007/2/3    179
11    10     2007/2/3    179
12    9     2007/2/3    187
13    7     2007/2/3    188
14    15     2007/2/3    188
15    14     2007/2/3    975
16
17
18
19
20

マクロ記録から以下のコードは分かったのですが・・・。
Sub 並べ替え()
 Range("A7:O15").Sort Key1:=Range("D7"), Order1:=xlAscending, 
 Header:=xlGuess, OrderCustom:=1, Orientation:=xlTopToBottom,
 SortMethod:=xlPinYin
End Sub 
ご教授よろしくお願いします。

【46985】Re:条件つき列の並べ替え [46222]関連
発言  かみちゃん  - 07/2/24(土) 17:37 -

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

>*条件・・・常にC列における最新の日付けの行を選択。下記の例では2007/2/3が 該当する。つまり、7行から15行が該当しA7〜O15を並べ替えたい。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=46222;id=excel
のスレッドの関連かと思いますが、この中の[46229]のichinoseさんのコードを
少し改造するだけでできます。

具体的には、以下のような感じになります。
Sub main2()
 Dim rw2 As Long
 Dim rw1 As Long
 Dim newdate As Date
 
 With Worksheets("Sheet1")
  rw2 = .Cells(.Rows.Count, "c").End(xlUp).Row
  newdate = .Range("c" & rw2).Value
  For rw1 = rw2 - 1 To 1 Step -1
   If .Range("c" & rw1).Value <> newdate Then Exit For
  Next rw1
'  .Range(.Cells(rw1 + 1, 1), .Cells(rw2, 1)).Copy
'  Worksheets("sheet2").Range("v6").PasteSpecial xlValue
'  Application.CutCopyMode = False
  
  With .Rows(rw1 + 1)
'   Range("A7:O15").Sort Key1:=Range("D7"), Order1:=xlAscending,
   .Resize(rw2 - rw1, 15) _
    .Sort Key1:=.Resize(, 1).Offset(, 3), Order1:=xlAscending, _
     Header:=xlGuess, OrderCustom:=1, Orientation:=xlTopToBottom, _
      SortMethod:=xlPinYin
  End With
 End With
End Sub

【46991】Re:条件つき列の並べ替え [46222]関連
回答  Hirofumi  - 07/2/24(土) 18:14 -

引用なし
パスワード
   先頭行に列見出しが有る物とします

Option Explicit

Public Sub Sample()

  'データ列数を設定(例えばA列〜O列で15列)
  Const clngColumns As Long = 15
  '日付の有る列位置を設定(基準セル位置のA列からの列Offset:C列)
  Const clngDate As Long = 2
  'D列の列位置を設定(基準セル位置のA列からの列Offset:D列)
  Const clngKey As Long = 3
  
  Dim i As Long
  Dim lngRows As Long
  Dim rngList As Range
  Dim vntData As Variant
  Dim strProm As String
  
  'Listの左上隅セル位置を基準として設定(列見出しの最左セル位置)
  Set rngList = ActiveSheet.Cells(1, "A")
  
  '画面更新を停止
  Application.ScreenUpdating = False
  
  With rngList
    'データ行数を取得
    lngRows = .Offset(Rows.Count - .Row, clngDate).End(xlUp).Row - .Row
    'データが無い場合
    If lngRows <= 0 Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    '日付データを配列に取得
    vntData = .Offset(1, clngDate).Resize(lngRows + 1).Value
  End With
  
  '日付の行位置を取得
  For i = lngRows - 1 To 1 Step -1
    If vntData(lngRows, 1) <> vntData(i, 1) Then
      Exit For
    End If
  Next i
  
  'データを整列
  With rngList
    If lngRows - i > 0 Then
      .Offset(i + 1).Resize(lngRows - i, clngColumns).Sort _
          Key1:=.Offset(i + 1, clngKey), Order1:=xlAscending, _
          Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
          Orientation:=xlTopToBottom, SortMethod:=xlCodePage
    End If
  End With
  
  strProm = "処理が完了しました"
  
Wayout:
  
  '画面更新を再開
  Application.ScreenUpdating = True
  
  Set rngList = Nothing
  
  MsgBox strProm, vbInformation
  
End Sub

【46994】Re:条件つき列の並べ替え [46222]関連
お礼  さや  - 07/2/24(土) 18:41 -

引用なし
パスワード
   お二人ともご丁寧な回答ありがとうございました。
よろしければ、下記の件について教えて下さい。

かみちゃん さんのコードにおいて
1.「For rw1 = rw2 - 1 To 1 Step -1」の意味

2.「.Resize(rw2 - rw1, 15)」の中の15の意味

よろしくお願いします。

【46995】Re:条件つき列の並べ替え [46222]関連
発言  かみちゃん  - 07/2/24(土) 18:50 -

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

>1.「For rw1 = rw2 - 1 To 1 Step -1」の意味

[46229]のichinoseさんのコードは理解されていますか?
For 〜 Next ステートメントのヘルプは確認されていますか?

>2.「.Resize(rw2 - rw1, 15)」の中の15の意味

Resizeプロパティのヘルプは確認されていますか?
以下のコードでResizeの中をいろいろ変えて確認してみてください。
Sub Sample()
 Range("A1").Resize(2, 15).Select
End Sub

【47005】Re:条件つき列の並べ替え [46222]関連
お礼  さや  - 07/2/24(土) 20:31 -

引用なし
パスワード
   かみちゃん さんアドバイスありがとうございました。

>2.「.Resize(rw2 - rw1, 15)」の中の15の意味
わかりました。

>1.「For rw1 = rw2 - 1 To 1 Step -1」の意味
For 〜 Next ステートメントはどうも苦手です。
ネット等で学んでみます。

【47007】Re:条件つき列の並べ替え [46222]関連
発言  かみちゃん  - 07/2/24(土) 21:39 -

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

>>1.「For rw1 = rw2 - 1 To 1 Step -1」の意味
>For 〜 Next ステートメントはどうも苦手です。
>ネット等で学んでみます。

ネット等で調べるのもひとつですが、まずはヘルプを調べるのが先かと思います。
もしかして、ヘルプをインストールしていないのであれば、それは、インストールしたほうがいいと思います。

なお、For 〜 Loopなどの繰り返し処理は、VBAの基本になるかと思いますが、
以下のようなURLあたりが参考になるかと思います。
http://www6.plala.or.jp/MilkHouse/menu.html
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_for_next.html
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_050_02.html

【47015】Re:条件つき列の並べ替え [46222]関連
質問  さや  - 07/2/25(日) 4:38 -

引用なし
パスワード
   かみちゃん さん、おはようございます。
アドバイスありがとうございます。

>もしかして、ヘルプをインストールしていないのであれば、それは、インストールしたほうがいいと思います。
ヘルプはインストールしてはいますが、VBAに限らずヘルプは非常に分かりにくいと思います。
でも、粘り強く調べてみます。

【47023】Re:条件つき列の並べ替え [46222]関連
発言  かみちゃん  - 07/2/25(日) 15:01 -

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

>VBAに限らずヘルプは非常に分かりにくいと思います。

個人個人感覚が違うので、おそらくご理解いただけないのかと思いますが、
特にVBAにおいては、ヘルプは充実していると思います。

わからない記述の上で、F1キーを押すと、そのヘルプが表示されます。
(たまに変数名をヘルプを参照しようとする方がいますが、それは流石にできません)
ヘルプの言い回しはたしかにわからないことは、多々ありますが、使用例も載っています。
そしたら、使用例を試してみて、それでまたわからないことが出てきたら、さらに
ヘルプを参照するといった使い方ができます。

掲示板に質問するときも、ヘルプを見たけど、ヘルプの何々という意味がわからない
というような質問をされるとより理解が深まり応用も効くものと思います。

【47025】Re:条件つき列の並べ替え [46222]関連
お礼  さや  - 07/2/25(日) 18:20 -

引用なし
パスワード
   かみちゃん さん、こんばんは。
非常に親切なアドバイスありがとうございます。

>わからない記述の上で、F1キーを押すと、そのヘルプが表示されます。
この件は知りませんでした。今後、十分に活用したいと思います。

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