Excel VBA質問箱 IV

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

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


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

【71380】実行日を取得するマクロとコピーした行挿入 どじょりん 12/2/28(火) 5:40 質問[未読]
【71381】Re:実行日を取得するマクロとコピーした行... ichinose 12/2/28(火) 8:05 発言[未読]
【71386】Re:実行日を取得するマクロとコピーした行... UO3 12/2/28(火) 12:36 発言[未読]
【71387】Re:実行日を取得するマクロとコピーした行... UO3 12/2/28(火) 12:40 発言[未読]
【71390】Re:実行日を取得するマクロとコピーした行... UO3 12/2/28(火) 13:00 発言[未読]
【71391】Re:実行日を取得するマクロとコピーした行... UO3 12/2/28(火) 13:06 発言[未読]
【71395】Re:実行日を取得するマクロとコピーした行... UO3 12/2/28(火) 14:49 発言[未読]
【71401】Re:実行日を取得するマクロとコピーした行... どじょりん 12/2/29(水) 0:50 お礼[未読]
【71428】Re:実行日を取得するマクロとコピーした行... どじょりん 12/3/1(木) 18:46 質問[未読]
【71431】Re:実行日を取得するマクロとコピーした行... UO3 12/3/1(木) 22:27 回答[未読]
【71432】Re:実行日を取得するマクロとコピーした行... UO3 12/3/1(木) 22:32 発言[未読]
【71474】Re:実行日を取得するマクロとコピーした行... どじょりん 12/3/9(金) 4:59 質問[未読]
【71477】Re:実行日を取得するマクロとコピーした行... UO3 12/3/9(金) 13:46 回答[未読]

【71380】実行日を取得するマクロとコピーした行挿...
質問  どじょりん  - 12/2/28(火) 5:40 -

引用なし
パスワード
   マクロを実行した日を入力するマクロが実行できなくて困っています。  


シート1(台帳)に以下のような帳票があります。


    A列   B列    C列     D列


2  販売数  販売先   品 名    在庫数
  --------------------------------------------
3   1    A社     AAA     10
  --------------------------------------------
4              BBB      8
  --------------------------------------------
5   2    B社    CCC     7 
  --------------------------------------------

以下 続く

1行目にはコマンドボタンがあります。
ボタンでこの表の販売数に数を入力した行をシート1から削除します。
が、念のためシート2(削除一覧)にマクロ実行日とともに残そうと思っています。

シート2はこんな感じです。


    A列     B列    C列     D列

1  販売日    販売先   品 名    販売数
  -------------------------------------------------
2 マクロ実行日   A社   AAA     1
  -------------------------------------------------
3 マクロ実行日   B社   CCC     2
  -------------------------------------------------

これより下は過去の削除データが記録されている。


考えたマクロは以下のとおりです。

Private Sub CommandButton1_Click()

Dim Choice As Integer
Dim Msg1 As String
Dim Msg2 As String
Dim Msg3 As String
Dim i As Long
Dim j As Long

Msg1 = "販売数に入力された数が台帳より削減されます。"
Msg2 = "数量がゼロになった物品は行ごと削除されます。"
Msg3 = "処理を続けますか?"


Choice = MsgBox((Msg1 & vbCrLf & Msg2 & vbCrLf & "" & vbCrLf & Msg3), vbYesNo + vbExclamation, ("注意"))
Select Case Choice
Case vbYes
 
  With Sheets("台帳")
  .Select
  On Error Resume Next
  Range("A3:A65536").SpecialCells(xlCellTypeConstants).EntireRow.Copy
  End With
  
  With Sheets("削除一覧")
  .Range("2:2").Insert
  .Columns("A:D").EntireColumn.AutoFit
  
  End With

  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
   Sheets("削除一覧").Cells(i, 4) = Sheets("削除一覧").Cells(i, 1)
   Sheets("削除一覧").Cells(i, 1) = Format(Now(),"yyyy/mm/dd)
   Next


  With Sheets("台帳")
  .Select


 For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row
 Cells(i, 4) = Cells(i, 4) - Cells(i, 1)
 Next

 For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row
 Range(Cells(i, 1), Cells(i, 2)).ClearContents
 Next

 For j = Cells(Rows.Count, 3).End(xlUp).Row To 3 Step -1
 If Cells(j, 4).Value = 0 Then Cells(j, 4).EntireRow.Delete
 Next
 
 End With

Case vbNo
Sheets("台帳").Select


End Select
End Sub


このマクロの
「Sheets("削除一覧").Cells(i, 1) = Format(Now(),"yyyy/mm/dd)」
の部分が上手くできず止まってしまいます。
よろしくお願いします。

あわせて、A列に何も入力しない状況でボタンをおすと、
シート2に空白行が挿入されてしまいます。
こうならない方法もあわせて教えてください。

 

【71381】Re:実行日を取得するマクロとコピーした...
発言  ichinose  - 12/2/28(火) 8:05 -

引用なし
パスワード
   ▼どじょりん さん:
>マクロを実行した日を入力するマクロが実行できなくて困っています。  
>
おはようございます。


>Private Sub CommandButton1_Click()
>
>Dim Choice As Integer
>Dim Msg1 As String
>Dim Msg2 As String
>Dim Msg3 As String
>Dim i As Long
>Dim j As Long
>
>Msg1 = "販売数に入力された数が台帳より削減されます。"
>Msg2 = "数量がゼロになった物品は行ごと削除されます。"
>Msg3 = "処理を続けますか?"
>
>
>Choice = MsgBox((Msg1 & vbCrLf & Msg2 & vbCrLf & "" & vbCrLf & Msg3), vbYesNo + vbExclamation, ("注意"))
>Select Case Choice
> Case vbYes
> 
>  With Sheets("台帳")
>  .Select
>  On Error Resume Next
>  Range("A3:A65536").SpecialCells(xlCellTypeConstants).EntireRow.Copy
>  End With
>  
>  With Sheets("削除一覧")
>  .Range("2:2").Insert
>  .Columns("A:D").EntireColumn.AutoFit
>  
>  End With
>
>  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
>   Sheets("削除一覧").Cells(i, 4) = Sheets("削除一覧").Cells(i, 1)
>   Sheets("削除一覧").Cells(i, 1) = Format(Now(),"yyyy/mm/dd)
>   Next
>
>
>  With Sheets("台帳")
>  .Select
>
>
> For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row
> Cells(i, 4) = Cells(i, 4) - Cells(i, 1)
> Next
>
> For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row
> Range(Cells(i, 1), Cells(i, 2)).ClearContents
> Next
>
> For j = Cells(Rows.Count, 3).End(xlUp).Row To 3 Step -1
> If Cells(j, 4).Value = 0 Then Cells(j, 4).EntireRow.Delete
> Next
> 
> End With
>
>Case vbNo
>Sheets("台帳").Select
>
>
>End Select
>End Sub
>
>
>このマクロの
>「Sheets("削除一覧").Cells(i, 1) = Format(Now(),"yyyy/mm/dd)」
記述ミス? ということですか?

Sheets("削除一覧").Cells(i, 1).value = Format(Now(),"yyyy/mm/dd")
プロパティは、しっかり記述する癖を付けてください。


>の部分が上手くできず止まってしまいます。

【71386】Re:実行日を取得するマクロとコピーした...
発言  UO3  - 12/2/28(火) 12:36 -

引用なし
パスワード
   ▼どじょりん さん:

こんにちは

エラーについてはichinoseさんから回答がありました。

>あわせて、A列に何も入力しない状況でボタンをおすと、
>シート2に空白行が挿入されてしまいます。
>こうならない方法もあわせて教えてください。

コードの記述全般については思うところも多々ありますが、とりあえず。

Dim myR As Range といったものを規定しておいて

With Sheets("台帳")
    .Select
    On Error Resume Next
    Set myR = Range("A3:A65536").SpecialCells(xlCellTypeConstants)
    If myR Is Nothing Then
      MsgBox "削除すべきデータがありません"
      Exit Sub
    End If
    myR.EntireRow.Copy
End With

こうすればよろしいかと。

ただし、以降、このmyRを相手に処理することが必要です。

ところで、たとえば在庫が10あり、そこに販売が1と入っても、まだ9残っているわけですが
それを削除してもいいのですか?

【71387】Re:実行日を取得するマクロとコピーした...
発言  UO3  - 12/2/28(火) 12:40 -

引用なし
パスワード
   ▼どじょりん さん:

ごめんなさい

    On Error Resume Next
    Set myR = Range("A3:A65536").SpecialCells(xlCellTypeConstants)
    On Error GoTo 0

このように On Error Goto 0 を追加してください.

【71390】Re:実行日を取得するマクロとコピーした...
発言  UO3  - 12/2/28(火) 13:00 -

引用なし
パスワード
   ▼どじょりん さん:

さらに、さらに、ごめんなさいの二乗です。
対象があったか無かったかは提示コードで把握できますが、以降のCopyでは
myRを使うと正しい処理ができません。
ですので、有無の判定だけにお使いください。

【71391】Re:実行日を取得するマクロとコピーした...
発言  UO3  - 12/2/28(火) 13:06 -

引用なし
パスワード
   ▼どじょりん さん:

なんども、おばかな書き込みをしてスレを汚し、申し訳ありませんでした。
今までのコメントを全て無視して、プロシジャの先頭に
  If WorksheetFunction.Count(Worksheets("台帳").Columns("A")) = 0 Then
      MsgBox "削除すべきデータがありません"
    Exit Sub
  End If

これでよろしいかと。
(コード記述に関する「思うところ」は多々ありますよ)

【71395】Re:実行日を取得するマクロとコピーした...
発言  UO3  - 12/2/28(火) 14:49 -

引用なし
パスワード
   ▼どじょりん さん:

こんにちは

アップされたコードを踏まえようかとも思いましたが、全くの別方式で。
以下を前提にしています。

1.コマンドボタンは、台帳シートに配置された「ActiveXボタン」(コントロールツールボックスのボタン)
2.で、CommandButton1_Click は台帳シートのシートモジュールに書かれている。
3.台帳シートの1行目は、完全に空白セル。(ボタンのみ配置されていて、値が入っていない)

また、勝手に、処理後、D列の在庫数を引落し、その結果、在庫が0になったものを消しています。
(実際には、削除は行わず、在庫があるものだけで上書きしています)

Private Sub CommandButton1_Click()
  Dim wkCol As Long
  Dim x As Long
  Dim y As Long
  
  If WorksheetFunction.Count(Columns("A")) = 0 Then
      MsgBox "削除すべきデータがありません"
    Exit Sub
  End If

  Application.ScreenUpdating = False
  
  'まず空白以外を抽出
  wkCol = Range("A2").CurrentRegion.Columns.Count + 2 '作業列番号
  Cells(1, wkCol).Value = Range("A2").Value      '販売数タイトル
  Cells(2, wkCol).Value = "<>"            '抽出条件 空白以外
    
  Range("A2").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Cells(1, wkCol).Resize(2), CopyToRange:=Cells(1, wkCol + 2), Unique:=False
  With Cells(1, wkCol + 2).CurrentRegion
    y = .Rows.Count - 1 '抽出データ行数
    x = .Columns.Count '一覧列数
  End With
  
  With Worksheets("削除一覧")
    .Rows(2).Resize(y).Insert
    .Range("A2").Resize(y, x).Value = Cells(2, wkCol + 2).Resize(y, x).Value
    .Range("A2").Resize(y).Value = Date
  End With
  
  '在庫引落
  y = Range("A" & Rows.Count).End(xlUp).Row
  Range("A3:A" & y).Copy
  Range("D3").PasteSpecial Paste:=xlPasteAll, Operation:=xlSubtract, _
                      SkipBlanks:=False, Transpose:=False

  Cells(1, wkCol + 2).CurrentRegion.Clear
  Cells(1, wkCol).Value = Range("D2").Value      '在庫数タイトル
  Cells(2, wkCol).Value = ">0"            '抽出条件 在庫 0
  
  Range("A2").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Cells(1, wkCol).Resize(2), CopyToRange:=Cells(1, wkCol + 2), Unique:=False
    
  'リスト置換え
  With Range("A2").CurrentRegion
    .Value = Cells(1, wkCol + 2).Resize(.Rows.Count, .Columns.Count).Value
  End With
  
  Cells(1, wkCol).CurrentRegion.Clear
  Cells(1, wkCol + 2).CurrentRegion.Clear
  
  Application.ScreenUpdating = True
  
  MsgBox "処理が終わりました"
  
End Sub

【71401】Re:実行日を取得するマクロとコピーした...
お礼  どじょりん  - 12/2/29(水) 0:50 -

引用なし
パスワード
   ichinoseさん、UO3さん、ありがとうございます。
連絡が遅れて申し訳ありません。

「.value」がないのに気づかず、本気で悩んでいました。
まだまだ初心者で、記録したマクロを元に変更していく程度の技術しかありません。


コードの記述全般についても、これでいいのかどうかすら分かっていません。
むしろ、ご指摘いただいて感謝しています。
勉強になりました。
さっそく変更してみます。
ご指摘いただいたように、全面的に修正してみようと思っています

ありがとうございました。

【71428】Re:実行日を取得するマクロとコピーした...
質問  どじょりん  - 12/3/1(木) 18:46 -

引用なし
パスワード
   ご指摘いただいたコードで実行してみました。
その結果です。

1.sheet(削除一覧)の販売数欄に、台帳の在庫数が入力されている
  →台帳シートのA列の販売数を転記したい

2.sheet(削除一覧)の転記した部分は罫線がない

3.台帳シートのA列とB列に数と販売先が残っている
  →転記した後クリアーしたい


以上の3つの対処法もできればご教授ください。
  

【71431】Re:実行日を取得するマクロとコピーした...
回答  UO3  - 12/3/1(木) 22:27 -

引用なし
パスワード
   ▼どじょりん さん:

>1.sheet(削除一覧)の販売数欄に、台帳の在庫数が入力されている
>  →台帳シートのA列の販売数を転記したい

ごめんなさい。アップされたレイアウトをよく見ていませんでした。
ところで、罫線ですが、元シートの罫線と同じスタイルということですか?
とりあえず、以下は元シートの罫線が、あっても無視して、新たに、適当なものをセットしています。

Private Sub CommandButton1_Click()
  Dim wkCol As Long
  Dim x As Long
  Dim y As Long
 
  If WorksheetFunction.Count(Columns("A")) = 0 Then
      MsgBox "削除すべきデータがありません"
    Exit Sub
  End If

  Application.ScreenUpdating = False
 
  'まず空白以外を抽出
  wkCol = Range("A2").CurrentRegion.Columns.Count + 2 '作業列番号
  Cells(1, wkCol).Value = Range("A2").Value      '販売数タイトル
  Cells(2, wkCol).Value = "<>"            '抽出条件 空白以外
  
  Range("A2").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Cells(1, wkCol).Resize(2), CopyToRange:=Cells(1, wkCol + 2), Unique:=False
  With Cells(1, wkCol + 2).CurrentRegion
    y = .Rows.Count - 1 '抽出データ行数
    x = .Columns.Count '一覧列数
  End With
 
  With Worksheets("削除一覧")
    .Rows(2).Resize(y).Insert
    With .Range("A2").Resize(y, x)                '★追加
      .Value = Cells(2, wkCol + 2).Resize(y, x).Value     '★変更
      .Borders.LineStyle = xlThin               '★追加
      .Borders.Weight = xlContinuous              '★追加
    End With                           '★追加
    .Range("D2").Resize(x).Value = .Range("A2").Resize(x).Value '★追加
    .Range("A2").Resize(y).Value = Date
  End With
 
  '在庫引落
  y = Range("A" & Rows.Count).End(xlUp).Row
  Range("A3:A" & y).Copy
  Range("D3").PasteSpecial Paste:=xlPasteAll, Operation:=xlSubtract, _
                      SkipBlanks:=False, Transpose:=False

  Cells(1, wkCol + 2).CurrentRegion.Clear
  Cells(1, wkCol).Value = Range("D2").Value      '在庫数タイトル
  Cells(2, wkCol).Value = ">0"            '抽出条件 在庫 0
 
  Range("A2").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Cells(1, wkCol).Resize(2), CopyToRange:=Cells(1, wkCol + 2), Unique:=False
  
  'リスト置換え
  With Range("A2").CurrentRegion
    .Value = Cells(1, wkCol + 2).Resize(.Rows.Count, .Columns.Count).Value
    .Resize(.Rows.Count - 1, 2).Offset(1).ClearContents   '★追加
  End With
 
  Cells(1, wkCol).CurrentRegion.Clear
  Cells(1, wkCol + 2).CurrentRegion.Clear
 
  Application.ScreenUpdating = True
 
  MsgBox "処理が終わりました"
End Sub

【71432】Re:実行日を取得するマクロとコピーした...
発言  UO3  - 12/3/1(木) 22:32 -

引用なし
パスワード
   ▼どじょりん さん:

ごめんなさい

      .Borders.LineStyle = xlThin               '★追加
      .Borders.Weight = xlContinuous              '★追加

これは

      .Borders.LineStyle = xlContinuous            '★追加
      .Borders.Weight = xlThin                 '★追加

でした。

【71474】Re:実行日を取得するマクロとコピーした...
質問  どじょりん  - 12/3/9(金) 4:59 -

引用なし
パスワード
   何度も申し訳ありません。

教えていただいたコードで実行してみましたが、
どこかに不具合があるようです。
いろいろ調べてみましたが、わかりませんでした。
よろしければ、教えてください。

不具合とは、当初のシート1で
・1行目のAAAに数量を入れて実行後、再度1行目のAAAで実行
 →最初のAAAの数量がマクロ実行日になる
というものです。

いろいろな条件でやってみましたが、
2度目の実行時に1回目に実行した分の数量がマクロ実行日に変更されてしまいます。

コードのどこかに問題があるのかと考えてみましたが、どうしてもわかりません。


ついでに、もう一点、分かれば教えてください。
シート2の1行目(販売日、販売先等が入っている)はセルに色がつけてあります。
このマクロを実行すると、シート1から転記された行は、色つきセルになってしまいます。
これを無地のセルにするには、コードに記入して色をとるしかないでしょうか。

たびたびの質問、申し訳ありません。
よろしくお願いします。

【71477】Re:実行日を取得するマクロとコピーした...
回答  UO3  - 12/3/9(金) 13:46 -

引用なし
パスワード
   ▼どじょりん さん:、

>どこかに不具合があるようです。

ごめんなさい。
.Range("D2").Resize(x).Value = .Range("A2").Resize(x).Value '★追加
これを
.Range("D2").Resize(y).Value = .Range("A2").Resize(y).Value '★追加
にしてください。

>これを無地のセルにするには、コードに記入して色をとるしかないでしょうか。

そうですね。手作業で行挿入しても色がつきますよね。
コードを追加してください。

.Borders.Weight = xlThin                 '★追加
この後に
.Interior.ColorIndex = xlNone              '★追加

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