Excel VBA質問箱 IV

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

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


4540 / 13646 ツリー ←次へ | 前へ→

【56036】列の削除について クリシュナ 08/5/30(金) 1:10 質問[未読]
【56040】Re:列の削除について ひげくま 08/5/30(金) 9:14 発言[未読]
【56060】Re:列の削除について クリシュナ 08/5/31(土) 11:08 質問[未読]
【56043】Re:列の削除について kanabun 08/5/30(金) 11:10 発言[未読]
【56059】Re:列の削除について クリシュナ 08/5/31(土) 10:57 お礼[未読]

【56036】列の削除について
質問  クリシュナ  - 08/5/30(金) 1:10 -

引用なし
パスワード
   下記のような、データを作成しておりますが、特定の列を削除すべく、マクロを組みましたが、うまくいきませんでした。

 A     B  C  D  E ... R
      1/3 1/9 2/9 5/4   10/1
ケロッグ   3    5  9

マスタ      5

ケビン    1     1     1

クロノス   5  10  18  20

メディチ  3  1   15 1

 物を借ている個数を一定の日ごとに記録しております。一度帳簿を締めて現時点で、誰がどれだけ借りているかの値をBの列に持ってこようとしましたが、うまくいきませんでした。(10月1日に締めるとして、現時点での数が示されているのは、一番右端のセルであるため、右端以外のセルを全て削除するのがよいと考えた。)
 以下のとおりマクロを組みましたが、下の行へ一向に進みませんでした。
sub 帳簿締め()
Dim Ws2 as worksheet
Range("A2").activate

j = j + 1

For i = 2 To Ws2.Cells(65536, 1).End(xlUp).Row Step 1

 Range(Cells(j, 2), Cells(j, 2).End(xlToRight).Offset(0, -1)).Select
 Selection.Delete xlShiftToLeft
 
Next i

end sub

 大変お手数ですが、どのようにしたらうまくいくか、お教えいただけないでしょうか。

【56040】Re:列の削除について
発言  ひげくま  - 08/5/30(金) 9:14 -

引用なし
パスワード
   ▼クリシュナ さん:
> A     B  C  D  E ... R
>      1/3 1/9 2/9 5/4   10/1
>ケロッグ   3    5  9
>
>マスタ      5
>
>ケビン    1     1     1
>
>クロノス   5  10  18  20
>
>メディチ  3  1   15 1

見にくいので、書き込み欄の右下にある等幅にチェックを入れて、投稿し直してもらえますか?

> 以下のとおりマクロを組みましたが、下の行へ一向に進みませんでした。

以下が実際に組んだそのままのコードですか?

>sub 帳簿締め()
>Dim Ws2 as worksheet
>Range("A2").activate
>
>j = j + 1
>
> For i = 2 To Ws2.Cells(65536, 1).End(xlUp).Row Step 1
>
> Range(Cells(j, 2), Cells(j, 2).End(xlToRight).Offset(0, -1)).Select
> Selection.Delete xlShiftToLeft
> 
>Next i
>
>end sub

【56043】Re:列の削除について
発言  kanabun  - 08/5/30(金) 11:10 -

引用なし
パスワード
   ▼クリシュナ さん:
おじゃまします

> 以下のとおりマクロを組みましたが、下の行へ一向に進みませんでした。

↓を使って行番号を指定するなら、これをFor〜Nextの中に入れないと
  j はLoopのなかで増加してませんよ。
>j = j + 1

もっとも、Loop変数に i を使っているから、それをそのまま使えば済むはなし
とも思われます。
> For i = 2 To Ws2.Cells(65536, 1).End(xlUp).Row

あと、手順を変えて、

 → 1行目で 最終列を求め、その右となりの列に
   各行の 最終データを Copyする

という風にも 考えられませんか?

Sub Try1()
 Dim LastCol As Long
 Dim wkCol As Long
 
 LastCol = Range("IV1").End(xlToLeft).Column '1行目の最後の(日付)データの列番号
 wkCol = LastCol + 1       'その右隣り(この列に最後のデータを転記)
 
 Dim LastRow As Long
 Dim c As Range         '最終行まで 対象列にデータ書き込みLoop
 LastRow = Range("A65536").End(xlUp).Row
 For Each c In Range(Cells(2, wkCol), Cells(LastRow, wkCol))
  c.Value = c.End(xlToLeft).Value
 Next
 
 Range("B1", Cells(1, LastCol)).EntireColumn.Select
 If MsgBox("転記が完了しました。データ列を削除しますか?", _
   vbOKCancel) = vbOK Then
   'Selection.Delete '指定列を削除
 End If
 
End Sub

【56059】Re:列の削除について
お礼  クリシュナ  - 08/5/31(土) 10:57 -

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

>あと、手順を変えて、
>
> → 1行目で 最終列を求め、その右となりの列に
>   各行の 最終データを Copyする
>
>という風にも 考えられませんか?
 こういう考え方もあったのですね。まったく思いつきませんでした。
 
>
>Sub Try1()
> Dim LastCol As Long
> Dim wkCol As Long
> 
> LastCol = Range("IV1").End(xlToLeft).Column '1行目の最後の(日付)データの列番号
> wkCol = LastCol + 1       'その右隣り(この列に最後のデータを転記)
> 
> Dim LastRow As Long
> Dim c As Range         '最終行まで 対象列にデータ書き込みLoop
> LastRow = Range("A65536").End(xlUp).Row
> For Each c In Range(Cells(2, wkCol), Cells(LastRow, wkCol))
>  c.Value = c.End(xlToLeft).Value
> Next
> 
> Range("B1", Cells(1, LastCol)).EntireColumn.Select
> If MsgBox("転記が完了しました。データ列を削除しますか?", _
>   vbOKCancel) = vbOK Then
>   'Selection.Delete '指定列を削除
> End If
> 
>End Sub

 これで解決できました。私のマクロをよく見るとiとjが誤っていただけのようにも思われますが、処理速度が遅かったため、kanabunさんの方法の方が数段優れていることもわかりました。まことにありがとうございました。

【56060】Re:列の削除について
質問  クリシュナ  - 08/5/31(土) 11:08 -

引用なし
パスワード
   ▼ひげくま さん:
お返事まことにありがとうございます。
再度投稿させていただきます。

>> A     B  C  D  E ... R
>>      1/3 1/9 2/9 5/4   10/1
>>ケロッグ   3    5  9
>>マスタ      5
>>ケビン    1     1     1
>>クロノス   5  10  18  20
>>メディチ  3  1   15 1
>見にくいので、書き込み欄の右下にある等幅にチェックを入れて、投稿し直してもらえますか?
>
>> 以下のとおりマクロを組みましたが、下の行へ一向に進みませんでした。
>
>以下が実際に組んだそのままのコードですか?
>
>>sub 帳簿締め()
>>Dim Ws2 as worksheet
>>Range("A2").activate
>>
>>j = j + 1
>>
>> For i = 2 To Ws2.Cells(65536, 1).End(xlUp).Row Step 1
>>
>> Range(Cells(j, 2), Cells(j, 2).End(xlToRight).Offset(0, -1)).Select
>> Selection.Delete xlShiftToLeft
>> 
>>Next i
>>
>>end sub

 よく見るとiとjを混同しておりました。一行ずつ下がっていきましたが、データが1つしかない人の値も削除されてしまうことに気づきました。この点につきましては、自分でなんとか出来そうです。
 もっとうまくやれる方法がありましたら、お教えいただけないでしょうか?

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