Excel VBA質問箱 IV

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

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


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

【73577】データ処理 nonoka 13/1/24(木) 11:50 質問[未読]
【73579】Re:データ処理 UO3 13/1/24(木) 12:04 発言[未読]
【73581】Re:データ処理 UO3 13/1/24(木) 12:22 発言[未読]
【73589】Re:データ処理 nonoka 13/1/24(木) 14:13 回答[未読]
【73592】Re:データ処理 UO3 13/1/24(木) 14:52 発言[未読]
【73593】Re:データ処理 UO3 13/1/24(木) 15:12 発言[未読]
【73595】Re:データ処理 nonoka 13/1/24(木) 15:21 回答[未読]
【73594】Re:データ処理 UO3 13/1/24(木) 15:20 発言[未読]
【73596】Re:データ処理 nonoka 13/1/24(木) 15:31 質問[未読]
【73597】Re:データ処理 UO3 13/1/24(木) 16:24 発言[未読]
【73598】Re:データ処理 UO3 13/1/24(木) 16:37 発言[未読]
【73599】Re:データ処理 nonoka 13/1/24(木) 16:49 お礼[未読]

【73577】データ処理
質問  nonoka  - 13/1/24(木) 11:50 -

引用なし
パスワード
   いつもご教授頂きありがとうございます。

シート名 INPUT のF5のセルに任意の数字があります。
同シートのC5〜G5にコピーしたいセルが入力されています。

F5の数字をH5の数で割り算した数を
同シートのC7〜G7より下にコピーしたいです。余りが出れば余りも最終行に入れたいです。下記参考でF5、H5ともに毎回違う数字が入ります。

  C   D   E   F   G   H
5  あ  い   う  50   え  16  ←コピー元

7  あ  い   う  50   え  16  ←50÷16=3なので3回コピーして
8  あ  い   う  50   え  16
9  あ  い   う  50   え  16
10  あ  い   う  50   え  2  ←2余るので最終行に余り


コピーされたセル7行目から下を別シート シート名 計画表 の
C列〜G列の票の未入力部分にコピーしたいです。
計画表はどんどん追加していく形です。

そのあと別マクロでINPUTシートのコピーした部分を削除したいです。

質問が下手で申し訳ありませんが宜しくお願い申し上げます。

【73579】Re:データ処理
発言  UO3  - 13/1/24(木) 12:04 -

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

こんにちは

前スレでも申し上げましたけど、
1.必要行数を、いったんINPUTシートの7行目以降にコピー
2.その内容を計画表シートに追加
3.その後、INPUTシートの7行目以降にコピーされたものを削除

こうするなら、INPUTシートの7行目以降は【不要】ですよね?
なので、そこを経由させず、直接計画表に追加していけばいいと思うのですが
INPUTシートの7行目以降に、「一瞬」コピーする目的は何でしょうか?

【73581】Re:データ処理
発言  UO3  - 13/1/24(木) 12:22 -

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

まぁ、消去は別タイミングでということでしょうから。
以下でよろしいですか?
(前スレではコピー列数が同じではなかったのですが、今回はすねてC〜Gの5列ですね?)

Sub Sample()
  Dim n1 As Long
  Dim n2 As Long
  Dim n As Long
  Dim shTo As Worksheet
  Dim z1 As Long
  Dim z2 As Long
  Dim x As Long
  Dim c As Range

  Set shTo = Sheets("計画表")

  With Sheets("INPUT")
    Call Input消去
    z1 = 7         'INPUTのコピー開始行
    n1 = Val(.Range("F5").Value)
    n2 = Val(.Range("H5").Value)
    If n1 = 0 Or n2 = 0 Then
      MsgBox "F5とH5に正しい数字をいれてくださいね"
      Exit Sub
    End If
    
    n = n1 \ n2
    If n1 Mod n2 > 0 Then n = n + 1
    
    If n < 1 Then
      MsgBox "F5またはH5の数字が正しくないのでは?"
      Exit Sub
    End If
    
    x = 5          'コピー列数
    If n > 0 Then
      z2 = shTo.Range("C" & shTo.Rows.Count).End(xlUp).Row + 1
      .Range("C5").Resize(, x).Copy .Range("C" & z1).Resize(n)
      .Range("C5").Resize(, x).Copy shTo.Range("C" & z2).Resize(n)
    End If
    
  End With

End Sub

Sub Input消去()
  With Sheets("INPUT")
    Intersect(.Range("A1", .UsedRange).Offset(6), .Columns("C:G")).ClearContents
  End With
End Sub

【73589】Re:データ処理
回答  nonoka  - 13/1/24(木) 14:13 -

引用なし
パスワード
   ▼UO3様
早速ありがとうございました。

実行してみましたが、下記のようになってしまいました。

  C   D   E   F   G   H
5  あ  い   う  50   え  16  ←コピー元

7  あ  い   う  50   え    ←50÷16=3なので3回コピーして
8  あ  い   う  50   え  
9  あ  い   う  50   え  
10  あ  い   う  50   え    ←2余るので最終行に余り

Hの列が空白で表示されました。
下記のように表示させたいです。


  C   D   E   F   G   H
5  あ  い   う  50   え  16  ←コピー元

7  あ  い   う  50   え  16  ←50÷16=3なので3回コピーして
8  あ  い   う  50   え  16
9  あ  い   う  50   え  16
10  あ  い   う  50   え  2  ←2余るので最終行に余り

【73592】Re:データ処理
発言  UO3  - 13/1/24(木) 14:52 -

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

>Hの列が空白で表示されました。
>下記のように表示させたいです。
>

う〜ん、少しコードを読んで考えてほしかったんだけどね。
コメントも入れてあるので。

x = 5          'コピー列数

ということで 5列(C〜G列)というコードになっているんですよ。
C〜H列の 6列にしたいのなら

x = 6          'コピー列数

でどうぞ。

【73593】Re:データ処理
発言  UO3  - 13/1/24(木) 15:12 -

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

あぁ、

>10  あ  い   う  50   え  2  ←2余るので最終行に余り

ここを見ていませんでした。
最後にあまりの行があれば、そのあまりの数字を表示するんですね?
何のためというか、この数字を何に使うのかわかりませんが
↑で連絡した変更連絡の処置を行っても、あまりの行にも 16 が記載されます。
あまりの行に 2 を記載するコードは後程。

【73594】Re:データ処理
発言  UO3  - 13/1/24(木) 15:20 -

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

Input消去 は変更ありません。

Sub Sample2()
  Dim n1 As Long
  Dim n2 As Long
  Dim nx As Long
  Dim n As Long
  Dim shTo As Worksheet
  Dim z1 As Long
  Dim z2 As Long
  Dim x As Long
  Dim c As Range

  Set shTo = Sheets("計画表")

  With Sheets("INPUT")
    Call Input消去
    z1 = 7         'INPUTのコピー開始行
    n1 = Val(.Range("F5").Value)
    n2 = Val(.Range("H5").Value)
    If n1 = 0 Or n2 = 0 Then
      MsgBox "F5とH5に正しい数字をいれてくださいね"
      Exit Sub
    End If
  
    n = n1 \ n2
    nx = n1 Mod n2
    If nx > 0 Then n = n + 1
      
    If n < 1 Then
      MsgBox "F5またはH5の数字が正しくないのでは?"
      Exit Sub
    End If
  
    x = 6          'コピー列数
    If n > 0 Then
      z2 = shTo.Range("C" & shTo.Rows.Count).End(xlUp).Row + 1
      .Range("C5").Resize(, x).Copy .Range("C" & z1).Resize(n)
      .Range("C5").Resize(, x).Copy shTo.Range("C" & z2).Resize(n)
      If nx > 0 Then
        .Range("H" & z1).Offset(n - 1).Value = nx
        shTo.Range("H" & z2).Offset(n - 1) = nx
      End If
    End If
  
  End With

End Sub

【73595】Re:データ処理
回答  nonoka  - 13/1/24(木) 15:21 -

引用なし
パスワード
   そうなんです・・・。
何のためかというと
工場の納期管理システムを構築中で、

50個入れば一気に加工出来ない為、加工出来るMAX16個で加工するとします。
すると3回加工して残り2個残ります。2個捨てるわけにもいきませんので、
4回目に2個加工します。
出来るだけ個数を平均化したいと言うのが本音です。
例えば、50個に対しMAX16個 13個を3回して11個を1回というのが理想です。

【73596】Re:データ処理
質問  nonoka  - 13/1/24(木) 15:31 -

引用なし
パスワード
   出来ました。
すいません。勉強不足でした。
ありがとうございました。大変助かりました。
明日部長にある程度形にして見せなさいと言われていたので・・・。
ひとつ前に投稿しましたが、平均化も簡単に出来るのでしょうか?

【73597】Re:データ処理
発言  UO3  - 13/1/24(木) 16:24 -

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

はい。平均は割合と簡単に求めることができます。
表示の仕方なんですが
50/16 が3行、50/11 が 1行 でいいのでしょうか?
50/13 が3行、50/11 が 1行 とすべきなのでは?
つまりH列は投入数のほうがよろしいのでは?

【73598】Re:データ処理
発言  UO3  - 13/1/24(木) 16:37 -

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

とりあえずH列の値はそれぞれの投入数にしてあります。
なお、H列を増やした際のクリアも増やすのを失念していました。
以下、Input消去 も置換てください。

Sub Sample3()
  Dim n1 As Long
  Dim n2 As Long
  Dim nx As Long
  Dim n As Long
  Dim p1 As Long
  Dim p2 As Long
  Dim shTo As Worksheet
  Dim z1 As Long
  Dim z2 As Long
  Dim x As Long
  Dim c As Range

  Set shTo = Sheets("計画表")

  With Sheets("INPUT")
    Call Input消去
    z1 = 7         'INPUTのコピー開始行
    n1 = Val(.Range("F5").Value)
    n2 = Val(.Range("H5").Value)
    If n1 = 0 Or n2 = 0 Then
      MsgBox "F5とH5に正しい数字をいれてくださいね"
      Exit Sub
    End If
 
    n = n1 \ n2
    nx = n1 Mod n2
    If nx > 0 Then n = n + 1
    p1 = n1 \ n
    If n1 Mod n > 0 Then p1 = p1 + 1
    p2 = n1 - p1 * (n - 1)
   
    If n < 1 Then
      MsgBox "F5またはH5の数字が正しくないのでは?"
      Exit Sub
    End If
 
    x = 6          'コピー列数
    If n > 0 Then
      z2 = shTo.Range("C" & shTo.Rows.Count).End(xlUp).Row + 1
      .Range("C5").Resize(, x - 1).Copy .Range("C" & z1).Resize(n)
      .Range("C5").Resize(, x - 1).Copy shTo.Range("C" & z2).Resize(n)
      .Range("H" & z1).Resize(n - 1).Value = p1
      shTo.Range("H" & z2).Resize(n - 1).Value = p1
      .Range("H" & z1).Offset(n - 1).Value = p2
      shTo.Range("H" & z2).Offset(n - 1) = p2
    End If
 
  End With

End Sub

Sub Input消去()
  With Sheets("INPUT")
    Intersect(.Range("A1", .UsedRange).Offset(6), .Columns("C:H")).ClearContents
  End With
End Sub

【73599】Re:データ処理
お礼  nonoka  - 13/1/24(木) 16:49 -

引用なし
パスワード
   出来ました!
いろいろ数字変えて入れてみましたが、大丈夫だと思います。
また、お世話になるかと思いますが、その時は宜しくお願い致します。
本当にありがとうございました!

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