Excel VBA質問箱 IV

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

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


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

【44202】別のSHEETへの答え記入 素人じゅうすけ 06/11/8(水) 20:58 質問[未読]
【44206】Re:別のSHEETへの答え記入 りん 06/11/9(木) 12:02 発言[未読]
【44208】Re:別のSHEETへの答え記入 素人じゅうすけ 06/11/9(木) 18:01 お礼[未読]
【44215】Re:勘違いかもしれませんが yata 06/11/9(木) 22:13 回答[未読]
【44251】Re:勘違いかもしれませんが 素人じゅうすけ 06/11/10(金) 19:11 質問[未読]
【44255】Re:勘違いかもしれませんが yata 06/11/10(金) 22:44 回答[未読]
【44266】Re:勘違いかもしれませんが 素人じゅうすけ 06/11/11(土) 14:11 質問[未読]
【44289】Re:取り敢えず1項目だけ yata 06/11/12(日) 8:42 回答[未読]
【44291】Re:取り敢えず1項目だけ 素人じゅうすけ 06/11/12(日) 9:36 回答[未読]
【44293】Re:取り敢えず1項目だけ 素人じゅうすけ 06/11/12(日) 10:30 質問[未読]
【44301】Re:1項目の説明と2項目 yata 06/11/12(日) 19:10 回答[未読]
【44313】Re:1項目の説明と2項目 素人じゅうすけ 06/11/13(月) 9:30 回答[未読]
【44383】Re:1項目の説明と2項目 素人じゅうすけ 06/11/14(火) 17:21 質問[未読]
【44389】Re:訂正と2項目の行挿入 yata 06/11/14(火) 19:51 回答[未読]
【44404】Re:訂正と2項目の行挿入 素人じゅうすけ 06/11/15(水) 9:37 質問[未読]
【44420】Re:2項目の日付表示では yata 06/11/15(水) 21:34 回答[未読]
【44486】Re:2項目の日付表示では 素人じゅうすけ 06/11/18(土) 14:53 お礼[未読]
【44542】Re:2項目の日付表示では 素人じゅうすけ 06/11/21(火) 9:43 質問[未読]
【44568】Re:2項目の日付表示では yata 06/11/21(火) 22:46 回答[未読]
【44590】Re:2項目の日付表示では 素人じゅうすけ 06/11/22(水) 17:40 お礼[未読]

【44202】別のSHEETへの答え記入
質問  素人じゅうすけ E-MAIL  - 06/11/8(水) 20:58 -

引用なし
パスワード
   計算式のマクロをモジュールに記入後、計算の答えは出たのですが(InputBoxにて)、その答えを別のSHEETに記入する事はできるのでしょうか(出た答えをプリントアウトする為)?どのようにしたいかと言いますと・・・

1. A列に「日付」、B列に「重量」、C列に「金額」の表に計算式マクロを記入後、8/31と9/31のデータを使って9/1〜9/31のデータを算出し、別のSHEETに「9/1〜9/31」と計算の答えを出すこと。例で言いますと、8/31と9/31のデータを使って9月分のデータを出し、別のSHEETの「日付」の欄(A列)、「それぞれの答え」の欄(B.C.Dの列)に自動的に記入させる。ちなみに、「日付」の欄には「9/1〜9/31」(算出した日)と自動的に記入させる。算出させて出したものは4つあります。

2. A列に「日付」、C列に「人名」、G列に「数量」(他の列にもデータは記入されているが、ここでは使わない)。目的は、C列のある「人名」を指定すれば、「その人」の「数量」の合計と「日付(上から順に全て)」が、別のSHEETに自動的に記入されるようにする。しかも、合計の「数量」の多いものが上から順に並ばるようにしたいです。理想としては、1.項と同じく、別のSHEETに「人名」がA列、「合計数量」がB列、「全ての日付」がC列に来るようにしたいです。ただし、C列の「人名」は行によって違いますが、すべてが違う人名ではなく、規則が無くバラバラに記入されています。つまりのところ、何名かの「人名」が不規則にそれぞれの行に記入されているのです。また、一度指定した「人名」は二度指定出来ないようにもしたいです。

この二つ(説明は分かりますか?)をこなすには、どんなマクロになるのでしょうか?ちなみにセルの選択に使用したいのはInputBoxメソッドです。宜しくお願い致します。

最後に一つ。「VBE」とは何の略なのでしょうか?自分の使うパソコンでは「VBA」という項目が出たのですが、「VBE」と「VBA」には違いがあるのでしょうか?分かる方、よろしくお願いします。

【44206】Re:別のSHEETへの答え記入
発言  りん E-MAIL  - 06/11/9(木) 12:02 -

引用なし
パスワード
   素人じゅうすけ さん、こんにちわ。

↓こっちだけ。
>最後に一つ。「VBE」とは何の略なのでしょうか?自分の使うパソコンでは「VBA」という項目が出たのですが、「VBE」と「VBA」には違いがあるのでしょうか?分かる方、よろしくお願いします。

VBAはVisual Basic For Applicationの略です。
公式の説明
microsoft.com/japan/msdn/vba/prodinfo/backgrounder.htm#whatis

VBEはVisual Basic Editorの略で、そのものを示すオブジェクト名でもあります。
Visual Basic Editorとは、Alt + F11で表示される、マクロ(コード)の入力画面のことです。

↓MSDNのライブラリでの説明はこんな感じ。
VBE プロパティ
現在の VBE オブジェクトおよびそのプロパティへの参照を取得します。Application オブジェクトの VBE プロパティは、Visual Basic Editor を示します。

【44208】Re:別のSHEETへの答え記入
お礼  素人じゅうすけ E-MAIL  - 06/11/9(木) 18:01 -

引用なし
パスワード
   ▼りん さん:
ありがとうございました。やっと胸のつかえが取れました。
>素人じゅうすけ さん、こんにちわ。
>
>↓こっちだけ。
>>最後に一つ。「VBE」とは何の略なのでしょうか?自分の使うパソコンでは「VBA」という項目が出たのですが、「VBE」と「VBA」には違いがあるのでしょうか?分かる方、よろしくお願いします。
>
>VBAはVisual Basic For Applicationの略です。
>公式の説明
>microsoft.com/japan/msdn/vba/prodinfo/backgrounder.htm#whatis
>
>VBEはVisual Basic Editorの略で、そのものを示すオブジェクト名でもあります。
>Visual Basic Editorとは、Alt + F11で表示される、マクロ(コード)の入力画面のことです。
>
>↓MSDNのライブラリでの説明はこんな感じ。
>VBE プロパティ
>現在の VBE オブジェクトおよびそのプロパティへの参照を取得します。Application オブジェクトの VBE プロパティは、Visual Basic Editor を示します。

【44215】Re:勘違いかもしれませんが
回答  yata  - 06/11/9(木) 22:13 -

引用なし
パスワード
   素人じゅうすけ さん 今晩わ
1項目の答え
「8/31と9/31のデータを使って」 というのが良く分からないのですが、
何月分ということでしたら下記の様にできますが?(私は棚卸し表を作る時、月名で指定しています。)

Sub Test1()
Dim R As Long
Dim m As Integer  ''データ範囲の行数と月名
R = UsedRange.Rows.Count
m = Val(InputBox("抽出月"))
For Each Rng In Range(Range("A2"), Cells(R, 1))
If Month(Rng) = m Then
  Set CopyData = Range(Rng, Rng.Offset(, 3))
  CopyData.Copy _
    Destination:=Sheets(2).Range("A65536").End(xlUp).Offset(1, 0)
End If
Next
End Sub
--------------------------------------------------------
2項目
「数量の合計」とはG 列の「数量」以外にあるのですか?
単にA列、C列、G列を取り出して、降順に並べ替えるのでしたら
A列    C列    G列
日付    人名    数量
8月29日    A    100
8月30日    C    1
9月1日    D    1000
9月3日    A    200
9月5日    B    50
9月29日    F    30
9月30日    E    20
10月1日    C    2
10月2日    A    300
の様なデータがあるとして、特定の人のデータでその行にある特定のセルをだけを取り出す。

Sub Test2()
Dim R As Long, R2 As Long '元データの行数と転記先の行番号
Dim 人名 As String
R = UsedRange.Rows.Count
人名 = InputBox("抽出する人")
For Each Rng In Range(Range("C2"), Cells(R, 3))
If Rng.Value = 人名 Then
  With Sheets(2)
    R2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
    .Cells(R2, 1) = 人名
    .Cells(R2, 2) = Rng.Offset(0, 4)
    .Cells(R2, 3) = Rng.Offset(0, -2)
  End With
End If
Next
'降順に並べ替え
With Sheets(2)
.Activate
.Range("A1").Select
Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
End With
End Sub

【44251】Re:勘違いかもしれませんが
質問  素人じゅうすけ E-MAIL  - 06/11/10(金) 19:11 -

引用なし
パスワード
   ▼yata さん:
ご回答の件、本当にありがとうございました。
1項目の答えについてですが、なぜ「8/31と9/31のデータ」を使うのかと言いますと、「9月分のデータを出すために、9月の末日のデータから前の月の末日までのデータを引く」からです。「何月分」というよりは、「何月何日〜何月何日」という表示にしたいです。これは可能でしょうか?また、このマクロで設定すれば別のSHEETへ自動的に表示されるのでしょうか?(前回の質問内容のような感じで)

2項目についてですが、合計させる「数量」は一つだけです。(yataさんの表と同じような感じです)これも別のSHEETに表記されるのでしょうか?(前回質問と同じような感じで)

またお手数をかけますが、宜しくお願い致します。
>素人じゅうすけ さん 今晩わ
>1項目の答え
>「8/31と9/31のデータを使って」 というのが良く分からないのですが、
>何月分ということでしたら下記の様にできますが?(私は棚卸し表を作る時、月名で指定しています。)
>
>Sub Test1()
>Dim R As Long
>Dim m As Integer  ''データ範囲の行数と月名
>R = UsedRange.Rows.Count
>m = Val(InputBox("抽出月"))
>For Each Rng In Range(Range("A2"), Cells(R, 1))
> If Month(Rng) = m Then
>  Set CopyData = Range(Rng, Rng.Offset(, 3))
>  CopyData.Copy _
>    Destination:=Sheets(2).Range("A65536").End(xlUp).Offset(1, 0)
> End If
>Next
>End Sub
>--------------------------------------------------------
>2項目
>「数量の合計」とはG 列の「数量」以外にあるのですか?
>単にA列、C列、G列を取り出して、降順に並べ替えるのでしたら
> A列    C列    G列
>日付    人名    数量
>8月29日    A    100
>8月30日    C    1
>9月1日    D    1000
>9月3日    A    200
>9月5日    B    50
>9月29日    F    30
>9月30日    E    20
>10月1日    C    2
>10月2日    A    300
>の様なデータがあるとして、特定の人のデータでその行にある特定のセルをだけを取り出す。
>
>Sub Test2()
>Dim R As Long, R2 As Long '元データの行数と転記先の行番号
>Dim 人名 As String
>R = UsedRange.Rows.Count
>人名 = InputBox("抽出する人")
>For Each Rng In Range(Range("C2"), Cells(R, 3))
> If Rng.Value = 人名 Then
>  With Sheets(2)
>    R2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
>    .Cells(R2, 1) = 人名
>    .Cells(R2, 2) = Rng.Offset(0, 4)
>    .Cells(R2, 3) = Rng.Offset(0, -2)
>  End With
> End If
>Next
>'降順に並べ替え
>With Sheets(2)
> .Activate
> .Range("A1").Select
> Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
>End With
>End Sub

【44255】Re:勘違いかもしれませんが
回答  yata  - 06/11/10(金) 22:44 -

引用なし
パスワード
   素人じゅうすけ さん こんばんわ
1項目はこういう事ですか?

Sheet1に    
 A列  B列  C列
日付    重量    金額    8/31 と9/30 を指定して
8月28日    20    100
8月29日    30    200
8月29日    15    300
8月31日    100    400    →
9月2日    100    500
9月10日    25    600
9月30日    1000    700
10月1日    300    800
10月30日 200    100

Sheet2に
A列    B列   C列   D列
日付        重量   金額
9/1〜9/30     1125   1800  と表示

Sub Test1()
Dim R As Long
Dim m As Integer  'データ範囲の行数と月名
R = UsedRange.Rows.Count
md1 = InputBox("前月末日")
md2 = InputBox("今月末日")
'前の日付までの合計とあとの日付までの合計を出す
With Application.WorksheetFunction
For Each Rng In Range(Range("A2"), Cells(R, 1))
Select Case Rng.Value
  Case DateValue(md1)
    重量sum1 = .Sum(Range("B2", Cells(Rng.Row, 2)))
    金額sum1 = .Sum(Range("C2", Cells(Rng.Row, 3)))
    翌月の最初の日 = Rng.Offset(1, 0)
  Case DateValue(md2)
    重量sum2 = .Sum(Range("B2", Cells(Rng.Row, 2)))
    金額sum2 = .Sum(Range("C2", Cells(Rng.Row, 3)))
  End Select
Next
End With
'引き算をして別シートへ表示
With Sheets("Sheet2")
  .Range("A2") = Format(翌月の最初の日, "m/d") & "〜" & m2
  .Range("C2") = 重量sum2 - 重量sum1
  .Range("D2") = 金額sum2 - 金額sum1
End With

End Sub
私は在庫管理で使っているのは月末日が休みや入出庫データが無い場合があるので「月」名で
しています。その場合はFind関数で前月の最終行と当月の最終行を取得しています。

2項目もちょっと意味が分からないのですが、全ての人名について合計を出してからそれを並び替えるのですか?

【44266】Re:勘違いかもしれませんが
質問  素人じゅうすけ E-MAIL  - 06/11/11(土) 14:11 -

引用なし
パスワード
   ▼yata さん:
お返事ありがとうございます。
一項目につきましては、A列は「毎日の日付」が立てに順に記入されています。今回使う「重量」と「金額」は「毎日(其の他の列に毎日の重量・金額が記入された時点で)加算されています」。
例:
A列   B列   C列
日付  重量   金額
8月1日 300    450
8月2日 450    600

8月31日 990    1000
9月1日 1000   1200
9月2日 1150   1300


9月30日 2000   2200
10月1日 2100   2400
と、このような感じです。SHEET2に記入したいのは
例:
A列         B列     C列
日付        重量     金額
9月1日〜9月30日  1010     1200
です。(分かりますか?)また、A列に「項目」を入れて、
A列      B列           C列
日付    9月1日〜9月30日     10月1日〜10月31日
重量    1010             ・
金額    1200             ・
というふうにする方法もありましたら、教えてください。

2項目については、「指定した人物」の結果がSHEET2に記入され、その後また違う人を指定した場合、もしも後に指定した人の数量が多かった時に、SHEET2の中で自動的に「(後に選んだ)数量の多い人」が上に来て、少ない人が下に記入される様にしたいのです。つまり、別々に指定していきたいのです。「全ての人の合計と、その人が持ってきた日にちを出してから並び替える」方法もございましたら、是非教えてください。
我が儘三昧で大変恐縮ですが、何卒宜しくお願い致します。

>素人じゅうすけ さん こんばんわ
>1項目はこういう事ですか?
>
>Sheet1に    
> A列  B列  C列
>日付    重量    金額    8/31 と9/30 を指定して
>8月28日    20    100
>8月29日    30    200
>8月29日    15    300
>8月31日    100    400    →
>9月2日    100    500
>9月10日    25    600
>9月30日    1000    700
>10月1日    300    800
>10月30日 200    100
>
>Sheet2に
>A列    B列   C列   D列
>日付        重量   金額
>9/1〜9/30     1125   1800  と表示
>
>Sub Test1()
>Dim R As Long
>Dim m As Integer  'データ範囲の行数と月名
>R = UsedRange.Rows.Count
>md1 = InputBox("前月末日")
>md2 = InputBox("今月末日")
>'前の日付までの合計とあとの日付までの合計を出す
>With Application.WorksheetFunction
>For Each Rng In Range(Range("A2"), Cells(R, 1))
> Select Case Rng.Value
>  Case DateValue(md1)
>    重量sum1 = .Sum(Range("B2", Cells(Rng.Row, 2)))
>    金額sum1 = .Sum(Range("C2", Cells(Rng.Row, 3)))
>    翌月の最初の日 = Rng.Offset(1, 0)
>  Case DateValue(md2)
>    重量sum2 = .Sum(Range("B2", Cells(Rng.Row, 2)))
>    金額sum2 = .Sum(Range("C2", Cells(Rng.Row, 3)))
>  End Select
>Next
>End With
>'引き算をして別シートへ表示
>With Sheets("Sheet2")
>  .Range("A2") = Format(翌月の最初の日, "m/d") & "〜" & m2
>  .Range("C2") = 重量sum2 - 重量sum1
>  .Range("D2") = 金額sum2 - 金額sum1
>End With
>
>End Sub
>私は在庫管理で使っているのは月末日が休みや入出庫データが無い場合があるので「月」名で
>しています。その場合はFind関数で前月の最終行と当月の最終行を取得しています。
>
>2項目もちょっと意味が分からないのですが、全ての人名について合計を出してからそれを並び替えるのですか?

【44289】Re:取り敢えず1項目だけ
回答  yata  - 06/11/12(日) 8:42 -

引用なし
パスワード
   素人じゅうすけ さん おはようございます。
昨日は親戚の法要で出かけていまして回答が遅くなりました。
これから農作業をしなければなりませんので取り敢えず1項目だけ。


>一項目につきましては、A列は「毎日の日付」が立てに順に記入されています。今回使う「重量」と「金額」は「毎日(其の他の列に毎日の重量・金額が記入された時点で)加算されています」。
>例:
>A列   B列   C列
>日付  重量   金額
>8月1日 300    450
>8月2日 450    600
>・
>8月31日 990    1000
>9月1日 1000   1200
>9月2日 1150   1300
>・
>・
>9月30日 2000   2200
>10月1日 2100   2400
>と、このような感じです。SHEET2に記入したいのは
>例:
>A列         B列     C列
>日付        重量     金額
>9月1日〜9月30日  1010     1200
>です。(分かりますか?)また、A列に「項目」を入れて、
>A列      B列           C列
>日付    9月1日〜9月30日     10月1日〜10月31日
>重量    1010             ・
>金額    1200             ・
>というふうにする方法もありましたら、教えてください。

1項目
重量 金額は日毎で累計されているのですね。それでしたら2つの行番号を取り出して利用すればよいです。
●一つ目の回答
Sheet2に 9/1〜9/30 1010 1200    と表示するのは→以下で出来ます。
Sheet2にはA1,B1,C1にそれぞれフィールド名を入力して置いてください。

Sub Test1()
Dim R As Long  'データ範囲の行数
Dim md1 As String, md2 As String '2つの入力された日付
Dim r1 As Long, r2 As Long '取り出された行番号
Dim 期間 As String

R = UsedRange.Rows.Count
md1 = InputBox("前月末日")
md2 = InputBox("今月末日")
'指定された日付に対するセルの行番号を取得する
For Each Rng In Range(Range("A2"), Cells(R, 1))
Select Case Rng.Value
  Case DateValue(md1)
    r1 = Rng.Row
  Case DateValue(md2)
    r2 = Rng.Row
  End Select
Next
 'もっと良い方法があるかもしれませんが 「月/日」形式で表示
 'InputBox入力が「○月○日」でも可
 期間 = Month(DateValue(md2)) & "/1" & "〜" & Format(md2, "m/d")

'引き算をして別シートへ表示
With Sheets("Sheet2")
  '使われている最終行番号
  EndRow = .Range("A65536").End(xlUp).Row
  .Cells(EndRow + 1, 1) = 期間
  .Cells(EndRow + 1, 2) = Cells(r2, 2) - Cells(r1, 2)
  .Cells(EndRow + 1, 3) = Cells(r2, 3) - Cells(r1, 3)
End With
End Sub

●2つ目の回答
日付    9/1〜9/30
重量    1010
金額    1200        と表示するには
フィールド名をA1,A2,A3へ入力しておいて下さい

'引き算をして別シートへ表示 から下を
With Sheets("Sheet2")
  '1行目で使用されている列の一番右側の列番号を取得
  EndColumn = .Cells(1, 256).End(xlToLeft).Column
  .Cells(1, EndColumn + 1) = 期間
  .Cells(2, EndColumn + 1) = Cells(r2, 2) - Cells(r1, 2)
  .Cells(3, EndColumn + 1) = Cells(r2, 3) - Cells(r1, 3)
End With
に変更してください

【44291】Re:取り敢えず1項目だけ
回答  素人じゅうすけ E-MAIL  - 06/11/12(日) 9:36 -

引用なし
パスワード
   ▼yata さん:
yataさん おはようございます。
ご回答の件、有難うございました。今日は会社は休みなのですが、自分は会社に顔を出していますので早速これでやります。
2項目の回答お待ちしています。(本当に恐縮です・・・)

Excelとは関係ないのですが、「農作業」をされているという事は「食品原料」を扱われるということですよね?私も只今、中国の会社にて「食品原料」を扱っています。正直に言って、なんとなくマクロの作成などでは、yataさんと共通点が多いのではないかと思って(自分で勝手に)安心しております。多分、これからもこの「質問箱」に投稿すると思いますので、もし見かけたときには宜しくお願い致します。
>素人じゅうすけ さん おはようございます。
>昨日は親戚の法要で出かけていまして回答が遅くなりました。
>これから農作業をしなければなりませんので取り敢えず1項目だけ。
>
>
>>一項目につきましては、A列は「毎日の日付」が立てに順に記入されています。今回使う「重量」と「金額」は「毎日(其の他の列に毎日の重量・金額が記入された時点で)加算されています」。
>>例:
>>A列   B列   C列
>>日付  重量   金額
>>8月1日 300    450
>>8月2日 450    600
>>・
>>8月31日 990    1000
>>9月1日 1000   1200
>>9月2日 1150   1300
>>・
>>・
>>9月30日 2000   2200
>>10月1日 2100   2400
>>と、このような感じです。SHEET2に記入したいのは
>>例:
>>A列         B列     C列
>>日付        重量     金額
>>9月1日〜9月30日  1010     1200
>>です。(分かりますか?)また、A列に「項目」を入れて、
>>A列      B列           C列
>>日付    9月1日〜9月30日     10月1日〜10月31日
>>重量    1010             ・
>>金額    1200             ・
>>というふうにする方法もありましたら、教えてください。
>
>1項目
>重量 金額は日毎で累計されているのですね。それでしたら2つの行番号を取り出して利用すればよいです。
>●一つ目の回答
>Sheet2に 9/1〜9/30 1010 1200    と表示するのは→以下で出来ます。
>Sheet2にはA1,B1,C1にそれぞれフィールド名を入力して置いてください。
>
>Sub Test1()
> Dim R As Long  'データ範囲の行数
> Dim md1 As String, md2 As String '2つの入力された日付
> Dim r1 As Long, r2 As Long '取り出された行番号
> Dim 期間 As String
>
> R = UsedRange.Rows.Count
> md1 = InputBox("前月末日")
> md2 = InputBox("今月末日")
> '指定された日付に対するセルの行番号を取得する
>For Each Rng In Range(Range("A2"), Cells(R, 1))
> Select Case Rng.Value
>  Case DateValue(md1)
>    r1 = Rng.Row
>  Case DateValue(md2)
>    r2 = Rng.Row
>  End Select
>Next
> 'もっと良い方法があるかもしれませんが 「月/日」形式で表示
> 'InputBox入力が「○月○日」でも可
> 期間 = Month(DateValue(md2)) & "/1" & "〜" & Format(md2, "m/d")
>
>'引き算をして別シートへ表示
>With Sheets("Sheet2")
>  '使われている最終行番号
>  EndRow = .Range("A65536").End(xlUp).Row
>  .Cells(EndRow + 1, 1) = 期間
>  .Cells(EndRow + 1, 2) = Cells(r2, 2) - Cells(r1, 2)
>  .Cells(EndRow + 1, 3) = Cells(r2, 3) - Cells(r1, 3)
>End With
>End Sub
>
>●2つ目の回答
>日付    9/1〜9/30
>重量    1010
>金額    1200        と表示するには
>フィールド名をA1,A2,A3へ入力しておいて下さい
>
>'引き算をして別シートへ表示 から下を
>With Sheets("Sheet2")
>  '1行目で使用されている列の一番右側の列番号を取得
>  EndColumn = .Cells(1, 256).End(xlToLeft).Column
>  .Cells(1, EndColumn + 1) = 期間
>  .Cells(2, EndColumn + 1) = Cells(r2, 2) - Cells(r1, 2)
>  .Cells(3, EndColumn + 1) = Cells(r2, 3) - Cells(r1, 3)
>End With
>に変更してください

【44293】Re:取り敢えず1項目だけ
質問  素人じゅうすけ E-MAIL  - 06/11/12(日) 10:30 -

引用なし
パスワード
   ▼yata さん:
再度の質問、申し訳ありません。
計算式のマクロは、「’引き算をして別シートへ表示」の部位(つまりは、NEXTとWITH SHEETSの間)に打ち込めば好いのでしょうか?
>素人じゅうすけ さん おはようございます。
>昨日は親戚の法要で出かけていまして回答が遅くなりました。
>これから農作業をしなければなりませんので取り敢えず1項目だけ。
>
>
>>一項目につきましては、A列は「毎日の日付」が立てに順に記入されています。今回使う「重量」と「金額」は「毎日(其の他の列に毎日の重量・金額が記入された時点で)加算されています」。
>>例:
>>A列   B列   C列
>>日付  重量   金額
>>8月1日 300    450
>>8月2日 450    600
>>・
>>8月31日 990    1000
>>9月1日 1000   1200
>>9月2日 1150   1300
>>・
>>・
>>9月30日 2000   2200
>>10月1日 2100   2400
>>と、このような感じです。SHEET2に記入したいのは
>>例:
>>A列         B列     C列
>>日付        重量     金額
>>9月1日〜9月30日  1010     1200
>>です。(分かりますか?)また、A列に「項目」を入れて、
>>A列      B列           C列
>>日付    9月1日〜9月30日     10月1日〜10月31日
>>重量    1010             ・
>>金額    1200             ・
>>というふうにする方法もありましたら、教えてください。
>
>1項目
>重量 金額は日毎で累計されているのですね。それでしたら2つの行番号を取り出して利用すればよいです。
>●一つ目の回答
>Sheet2に 9/1〜9/30 1010 1200    と表示するのは→以下で出来ます。
>Sheet2にはA1,B1,C1にそれぞれフィールド名を入力して置いてください。
>
>Sub Test1()
> Dim R As Long  'データ範囲の行数
> Dim md1 As String, md2 As String '2つの入力された日付
> Dim r1 As Long, r2 As Long '取り出された行番号
> Dim 期間 As String
>
> R = UsedRange.Rows.Count
> md1 = InputBox("前月末日")
> md2 = InputBox("今月末日")
> '指定された日付に対するセルの行番号を取得する
>For Each Rng In Range(Range("A2"), Cells(R, 1))
> Select Case Rng.Value
>  Case DateValue(md1)
>    r1 = Rng.Row
>  Case DateValue(md2)
>    r2 = Rng.Row
>  End Select
>Next
> 'もっと良い方法があるかもしれませんが 「月/日」形式で表示
> 'InputBox入力が「○月○日」でも可
> 期間 = Month(DateValue(md2)) & "/1" & "〜" & Format(md2, "m/d")
>
>'引き算をして別シートへ表示
>With Sheets("Sheet2")
>  '使われている最終行番号
>  EndRow = .Range("A65536").End(xlUp).Row
>  .Cells(EndRow + 1, 1) = 期間
>  .Cells(EndRow + 1, 2) = Cells(r2, 2) - Cells(r1, 2)
>  .Cells(EndRow + 1, 3) = Cells(r2, 3) - Cells(r1, 3)
>End With
>End Sub
>
>●2つ目の回答
>日付    9/1〜9/30
>重量    1010
>金額    1200        と表示するには
>フィールド名をA1,A2,A3へ入力しておいて下さい
>
>'引き算をして別シートへ表示 から下を
>With Sheets("Sheet2")
>  '1行目で使用されている列の一番右側の列番号を取得
>  EndColumn = .Cells(1, 256).End(xlToLeft).Column
>  .Cells(1, EndColumn + 1) = 期間
>  .Cells(2, EndColumn + 1) = Cells(r2, 2) - Cells(r1, 2)
>  .Cells(3, EndColumn + 1) = Cells(r2, 3) - Cells(r1, 3)
>End With
>に変更してください

【44301】Re:1項目の説明と2項目
回答  yata  - 06/11/12(日) 19:10 -

引用なし
パスワード
   素人じゅうすけ さん こんばんわ
ごめんなさい。返信が遅くなりました。
>再度の質問、申し訳ありません。
>計算式のマクロは、「’引き算をして別シートへ表示」の部位(つまりは、NEXTとWITH SHEETSの間)に打ち込めば好いのでしょうか?
「計算式のマクロ」とはどのような式を入れたいのですか?。
計算はここで出来ていますが
With Sheets("Sheet2")
  '使われている最終行番号
  EndRow = .Range("A65536").End(xlUp).Row
  .Cells(EndRow + 1, 1) = 期間
  .Cells(EndRow + 1, 2) = Cells(r2, 2) - Cells(r1, 2)
  .Cells(EndRow + 1, 3) = Cells(r2, 3) - Cells(r1, 3)
End With
元データがSheet1にあって、Sub Test1()〜End SubまでがSheet1のコードにあれば、
Sheet2の1行目に項目が入力してあれば、InputBoxで日付を 8/31,9/30[OK]、9/30,10/31[OK]、・・

とするたびに、2行目、3行目・・・と追加されて表示されるはずですが?
もう一つの方は1列目に項目が入力されていたら、1回目はB列に 2回目はB列がデータで埋まっているので、その右の列に・・・ということです。
Cells(r2, 2) - Cells(r1, 2) は重量を引き算しています。
Cells(r2, 3) - Cells(r1, 3) は金額を引き算しています
EndRow + 1 は使っている行の下の行番号
EndColumn + 1 は使っている右側の列番号 です。
●2項目
Sheet4に項目を入れておく。A1に人名 B1に数量

Sub Test2()
Dim R As Long, r2 As Long '元データの行数と転記先の行番号
Dim 人名 As String
Dim Sum As Double
R = UsedRange.Rows.Count

人名 = InputBox("抽出する人")

For Each Rng In Range(Range("C2"), Cells(R, 3))
If Rng.Value = 人名 Then
    'G列から取り出して合計する
    Sum = Sum + Rng.Offset(0, 4).Value
End If
Next
With Sheets(4)
    r2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
    .Cells(r2, 1) = 人名
    .Cells(r2, 2) = Sum
End With
'降順に並べ替え
With Sheets("Sheet4")
.Activate
'データが1件以上あったら並び替えをする
If .Range("A3") <> "" Then
.Range("A1").Select
Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
End If
End With
End Sub

C列に表示する日付について
例えばA氏のデータが3件あった場合は?

【44313】Re:1項目の説明と2項目
回答  素人じゅうすけ E-MAIL  - 06/11/13(月) 9:30 -

引用なし
パスワード
   ▼yata さん:
お返事ありがとうございます。
例えば、A氏が三件だとしますと、C列にその日付(縦に、つまりは1行目からスタートの場合は、1行目から3行目まで)早いもの順にすべて表示させたいのです。
その下、一行開けて次の人を表示させたいのです。次の人は5行目からのスタートと言うわけです。よろしくお願いします。
>素人じゅうすけ さん こんばんわ
>ごめんなさい。返信が遅くなりました。
>>再度の質問、申し訳ありません。
>>計算式のマクロは、「’引き算をして別シートへ表示」の部位(つまりは、NEXTとWITH SHEETSの間)に打ち込めば好いのでしょうか?
>「計算式のマクロ」とはどのような式を入れたいのですか?。
>計算はここで出来ていますが
>With Sheets("Sheet2")
>  '使われている最終行番号
>  EndRow = .Range("A65536").End(xlUp).Row
>  .Cells(EndRow + 1, 1) = 期間
>  .Cells(EndRow + 1, 2) = Cells(r2, 2) - Cells(r1, 2)
>  .Cells(EndRow + 1, 3) = Cells(r2, 3) - Cells(r1, 3)
>End With
>元データがSheet1にあって、Sub Test1()〜End SubまでがSheet1のコードにあれば、
>Sheet2の1行目に項目が入力してあれば、InputBoxで日付を 8/31,9/30[OK]、9/30,10/31[OK]、・・
>
>とするたびに、2行目、3行目・・・と追加されて表示されるはずですが?
>もう一つの方は1列目に項目が入力されていたら、1回目はB列に 2回目はB列がデータで埋まっているので、その右の列に・・・ということです。
>Cells(r2, 2) - Cells(r1, 2) は重量を引き算しています。
>Cells(r2, 3) - Cells(r1, 3) は金額を引き算しています
>EndRow + 1 は使っている行の下の行番号
>EndColumn + 1 は使っている右側の列番号 です。
>●2項目
>Sheet4に項目を入れておく。A1に人名 B1に数量
>
>Sub Test2()
>Dim R As Long, r2 As Long '元データの行数と転記先の行番号
>Dim 人名 As String
>Dim Sum As Double
>R = UsedRange.Rows.Count
>
>人名 = InputBox("抽出する人")
>
>For Each Rng In Range(Range("C2"), Cells(R, 3))
> If Rng.Value = 人名 Then
>    'G列から取り出して合計する
>    Sum = Sum + Rng.Offset(0, 4).Value
> End If
>Next
> With Sheets(4)
>    r2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
>    .Cells(r2, 1) = 人名
>    .Cells(r2, 2) = Sum
> End With
>'降順に並べ替え
>With Sheets("Sheet4")
> .Activate
> 'データが1件以上あったら並び替えをする
> If .Range("A3") <> "" Then
> .Range("A1").Select
> Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
> End If
>End With
>End Sub
>
>C列に表示する日付について
>例えばA氏のデータが3件あった場合は?

【44383】Re:1項目の説明と2項目
質問  素人じゅうすけ E-MAIL  - 06/11/14(火) 17:21 -

引用なし
パスワード
   ▼yata さん:
yataさん こんばんわ。
一つ問題があります。マクロを記入したのですが、「R=UsedRange.Rows.Count」のところで実行不能になります。「R=Rows.Count」と書き換えましたが、そのときに「Case DateValue(md1)」の部位にて実行不能になります。
何がどのようにいけないのでしょうか?
>素人じゅうすけ さん こんばんわ
>ごめんなさい。返信が遅くなりました。
>>再度の質問、申し訳ありません。
>>計算式のマクロは、「’引き算をして別シートへ表示」の部位(つまりは、NEXTとWITH SHEETSの間)に打ち込めば好いのでしょうか?
>「計算式のマクロ」とはどのような式を入れたいのですか?。
>計算はここで出来ていますが
>With Sheets("Sheet2")
>  '使われている最終行番号
>  EndRow = .Range("A65536").End(xlUp).Row
>  .Cells(EndRow + 1, 1) = 期間
>  .Cells(EndRow + 1, 2) = Cells(r2, 2) - Cells(r1, 2)
>  .Cells(EndRow + 1, 3) = Cells(r2, 3) - Cells(r1, 3)
>End With
>元データがSheet1にあって、Sub Test1()〜End SubまでがSheet1のコードにあれば、
>Sheet2の1行目に項目が入力してあれば、InputBoxで日付を 8/31,9/30[OK]、9/30,10/31[OK]、・・
>
>とするたびに、2行目、3行目・・・と追加されて表示されるはずですが?
>もう一つの方は1列目に項目が入力されていたら、1回目はB列に 2回目はB列がデータで埋まっているので、その右の列に・・・ということです。
>Cells(r2, 2) - Cells(r1, 2) は重量を引き算しています。
>Cells(r2, 3) - Cells(r1, 3) は金額を引き算しています
>EndRow + 1 は使っている行の下の行番号
>EndColumn + 1 は使っている右側の列番号 です。
>●2項目
>Sheet4に項目を入れておく。A1に人名 B1に数量
>
>Sub Test2()
>Dim R As Long, r2 As Long '元データの行数と転記先の行番号
>Dim 人名 As String
>Dim Sum As Double
>R = UsedRange.Rows.Count
>
>人名 = InputBox("抽出する人")
>
>For Each Rng In Range(Range("C2"), Cells(R, 3))
> If Rng.Value = 人名 Then
>    'G列から取り出して合計する
>    Sum = Sum + Rng.Offset(0, 4).Value
> End If
>Next
> With Sheets(4)
>    r2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
>    .Cells(r2, 1) = 人名
>    .Cells(r2, 2) = Sum
> End With
>'降順に並べ替え
>With Sheets("Sheet4")
> .Activate
> 'データが1件以上あったら並び替えをする
> If .Range("A3") <> "" Then
> .Range("A1").Select
> Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
> End If
>End With
>End Sub
>
>C列に表示する日付について
>例えばA氏のデータが3件あった場合は?

【44389】Re:訂正と2項目の行挿入
回答  yata  - 06/11/14(火) 19:51 -

引用なし
パスワード
   素人じゅうすけ さん こんばんわ
最初に
>一つ問題があります。マクロを記入したのですが、「R=UsedRange.Rows.Count」のところで実行不能になります。「R=Rows.Count」と書き換えましたが、そのときに「Case DateValue(md1)」の部位にて実行不能になります。
>何がどのようにいけないのでしょうか?
R=Range("A1").CurrentRegion.Rows.Count
または
R=Range("A65536").End(xlUp).Row
にしてください
>Case DateValue(md1)」の部位にて実行不能になります。
InputBoxには 9/1 又は 9月1日 の日付形式で入力して下さい。
元のA列は日付形式で入力されていると思いますが。それで日付形式で入力された文字列をシリアル値にする必要があるためです。
------------------------------------
次に
>例えば、A氏が三件だとしますと、C列にその日付(縦に、つまりは1行目からスタートの場合は、

1行目から3行目まで)早いもの順にすべて表示させたいのです。
>その下、一行開けて次の人を表示させたいのです。次の人は5行目からのスタートと言うわけです。

そうすると並べ替えというのは何を基準にするのですか?
先に提示したコードでは

名前指定 A氏 A氏が3件あったら合計して2行目に表示
人名 数量 日付
A   600
次にC氏を指定 2件で 合計850なら A氏より大きいからC氏が上になる。
人名 数量 日付
C   850
A   600
と並べ替えていますが、

ご説明の通りだと並び替えは必要なくて
人名 数量 日付
A   250  8/12
A   50  8/20
A   300  9/1
1行空ける
C   400  8/15
C   450  8/30
ということですか?
そうでしたら下記コードで

Sub Test2()
 Dim R As Long, R2 As Long '元データの行数と表示先の最終の行番号
 Dim 人名 As String
 '表示先Sheet4に項目が入っていなかったら実行しない
 If Sheets("Sheet4").Range("A1") = "" Then Exit Sub

 R = Range("A65536").End(xlUp).Row
 人名 = InputBox("抽出する人")

 '元データから拾い出してSheet4に表示
 For Each Rng In Range(Range("C2"), Cells(R, 3))
   If Rng.Value = 人名 Then
    With Sheets("Sheet4")
     .Activate
     R2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
   
     .Cells(R2, 1) = 人名
     .Cells(R2, 2) = Rng.Offset(0, 4)  '数量
     .Cells(R2, 3) = Rng.Offset(0, -2)  '日付
    End With
   End If
 Next

 '人名が2つ以上あったら間に行を挿入する
 Sheets("Sheet4").Activate
 With ActiveSheet
 If Range("A3") = "" Then Exit Sub
 For i = 3 To .Range("A65536").End(xlUp).Row
  If .Cells(i, 1) <> "" And .Cells(i - 1, 1) <> "" Then
    If .Cells(i, 1) <> .Cells(i - 1, 1) Then
    .Cells(i, 1).EntireRow.Insert
    End If
  End If
 Next i
 End With
End Sub

行挿入部分でエラー対策
 1.A3が空白 詰まりデータが1件しか表示されていないので、行挿入は不要
 2.iが3 詰まりA2とA3が空白でない時で人名が異なっている場合は 行を挿入
 3 以下同様
と処理されます
-------------------------------------------------------
最初に並べ替えということでしたが、これからどこを基準にして並べ替えをしたらいいですか?
もしかして C氏の合計が大きいから
人名 数量 日付
C   400  8/15
C   450  8/30
1行空ける
A   250  8/12
A   50  8/20
A   300  9/1
ということですか?
これはかなり難しいと思います。人名毎にデータ件数がバラバラだから。
新たに質問を立てて、詳しい方にお願いされるほうが良いかと思います。

【44404】Re:訂正と2項目の行挿入
質問  素人じゅうすけ E-MAIL  - 06/11/15(水) 9:37 -

引用なし
パスワード
   ▼yata さん:
yataさん こんにちわ。返信有難うございます。

2項目の件についてですが、結果的には数量の合計を基準にして並べ替えがしたいのです。
例:
A氏 850(これは合計値です。例:100+500+250) 9/1
     9/23
     10/1
    ↓
C氏 1000 9/2
      9/31

A氏 850  9/1
      9/23
      10/1
といった感じにしたいのです。やはり難しいのでしょうか?
>素人じゅうすけ さん こんばんわ
>最初に
>>一つ問題があります。マクロを記入したのですが、「R=UsedRange.Rows.Count」のところで実行不能になります。「R=Rows.Count」と書き換えましたが、そのときに「Case DateValue(md1)」の部位にて実行不能になります。
>>何がどのようにいけないのでしょうか?
>R=Range("A1").CurrentRegion.Rows.Count
>または
>R=Range("A65536").End(xlUp).Row
>にしてください
>>Case DateValue(md1)」の部位にて実行不能になります。
>InputBoxには 9/1 又は 9月1日 の日付形式で入力して下さい。
>元のA列は日付形式で入力されていると思いますが。それで日付形式で入力された文字列をシリアル値にする必要があるためです。
>------------------------------------
>次に
>>例えば、A氏が三件だとしますと、C列にその日付(縦に、つまりは1行目からスタートの場合は、
>
>1行目から3行目まで)早いもの順にすべて表示させたいのです。
>>その下、一行開けて次の人を表示させたいのです。次の人は5行目からのスタートと言うわけです。
>
>そうすると並べ替えというのは何を基準にするのですか?
>先に提示したコードでは
>
>名前指定 A氏 A氏が3件あったら合計して2行目に表示
>人名 数量 日付
>A   600
>次にC氏を指定 2件で 合計850なら A氏より大きいからC氏が上になる。
>人名 数量 日付
>C   850
>A   600
>と並べ替えていますが、
>
>ご説明の通りだと並び替えは必要なくて
>人名 数量 日付
>A   250  8/12
>A   50  8/20
>A   300  9/1
>1行空ける
>C   400  8/15
>C   450  8/30
>ということですか?
>そうでしたら下記コードで
>
>Sub Test2()
> Dim R As Long, R2 As Long '元データの行数と表示先の最終の行番号
> Dim 人名 As String
> '表示先Sheet4に項目が入っていなかったら実行しない
> If Sheets("Sheet4").Range("A1") = "" Then Exit Sub
>
> R = Range("A65536").End(xlUp).Row
> 人名 = InputBox("抽出する人")
>
> '元データから拾い出してSheet4に表示
> For Each Rng In Range(Range("C2"), Cells(R, 3))
>   If Rng.Value = 人名 Then
>    With Sheets("Sheet4")
>     .Activate
>     R2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
>   
>     .Cells(R2, 1) = 人名
>     .Cells(R2, 2) = Rng.Offset(0, 4)  '数量
>     .Cells(R2, 3) = Rng.Offset(0, -2)  '日付
>    End With
>   End If
> Next
>
> '人名が2つ以上あったら間に行を挿入する
> Sheets("Sheet4").Activate
> With ActiveSheet
> If Range("A3") = "" Then Exit Sub
> For i = 3 To .Range("A65536").End(xlUp).Row
>  If .Cells(i, 1) <> "" And .Cells(i - 1, 1) <> "" Then
>    If .Cells(i, 1) <> .Cells(i - 1, 1) Then
>    .Cells(i, 1).EntireRow.Insert
>    End If
>  End If
> Next i
> End With
>End Sub
>
>行挿入部分でエラー対策
> 1.A3が空白 詰まりデータが1件しか表示されていないので、行挿入は不要
> 2.iが3 詰まりA2とA3が空白でない時で人名が異なっている場合は 行を挿入
> 3 以下同様
>と処理されます
>-------------------------------------------------------
>最初に並べ替えということでしたが、これからどこを基準にして並べ替えをしたらいいですか?
>もしかして C氏の合計が大きいから
>人名 数量 日付
>C   400  8/15
>C   450  8/30
>1行空ける
>A   250  8/12
>A   50  8/20
>A   300  9/1
>ということですか?
>これはかなり難しいと思います。人名毎にデータ件数がバラバラだから。
>新たに質問を立てて、詳しい方にお願いされるほうが良いかと思います。

【44420】Re:2項目の日付表示では
回答  yata  - 06/11/15(水) 21:34 -

引用なし
パスワード
   素人じゅうすけ さん こんばんわ
2項目の日付表示について
C列に縦方向に表示ではなく、同じ行の右方向に表示でしたら割と簡単です。

最初に提示した行挿入が無いコードに追加してください
Sub Test2()
Dim R As Long, r2 As Long '元データの行数と転記先の行番号
Dim 人名 As String
Dim Sum As Double
R = UsedRange.Rows.Count

人名 = InputBox("抽出する人")

For Each Rng In Range(Range("C2"), Cells(R, 3))
If Rng.Value = 人名 Then
    'G列から取り出して合計する
    Sum = Sum + Rng.Offset(0, 4).Value

End If
Next

With Sheets("Sheet4")
    r2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
    .Cells(r2, 1) = 人名
    .Cells(r2, 2) = Sum
    For Each Rng In Range(Range("C2"), Cells(R, 3))    '●ここから
      If Rng.Value = 人名 Then
        日付 = Rng.Offset(0, -2)
        .Cells(r2, 1).End(xlToRight).Offset(0, 1) = 日付
      End If
    Next                        '●ここまでを追加
End With

'降順に並べ替え
With Sheets("Sheet4")
.Activate
'データが1件以上あったら並び替えをする
If .Range("A3") <> "" Then
.Range("A1").Select
Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
End If
End With
End Sub

これでも空白行を入れると
.Range("A1").Select
Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
では最初の空白行以降は並び替えの対象にならないので
.Range("A1").Select を全セルを対象にして .Cells.Select としなければなりません。
また、この場合は並び替えられたら空白行は全て取り除かれます。
ということで加工の対象となるデータは極力空白行を作ったりしない方がよいと思います。
必要なら全て作業が終わってから表を整えるのが良いと思います。

【44486】Re:2項目の日付表示では
お礼  素人じゅうすけ E-MAIL  - 06/11/18(土) 14:53 -

引用なし
パスワード
   ▼yata さん:
yataさん、こんにちわ。
早速、これで試します。本当に、毎々有難うございます。
>素人じゅうすけ さん こんばんわ
>2項目の日付表示について
>C列に縦方向に表示ではなく、同じ行の右方向に表示でしたら割と簡単です。
>
>最初に提示した行挿入が無いコードに追加してください
>Sub Test2()
>Dim R As Long, r2 As Long '元データの行数と転記先の行番号
>Dim 人名 As String
>Dim Sum As Double
>R = UsedRange.Rows.Count
>
>人名 = InputBox("抽出する人")
>
>For Each Rng In Range(Range("C2"), Cells(R, 3))
> If Rng.Value = 人名 Then
>    'G列から取り出して合計する
>    Sum = Sum + Rng.Offset(0, 4).Value
>
> End If
>Next
>
> With Sheets("Sheet4")
>    r2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
>    .Cells(r2, 1) = 人名
>    .Cells(r2, 2) = Sum
>    For Each Rng In Range(Range("C2"), Cells(R, 3))    '●ここから
>      If Rng.Value = 人名 Then
>        日付 = Rng.Offset(0, -2)
>        .Cells(r2, 1).End(xlToRight).Offset(0, 1) = 日付
>      End If
>    Next                        '●ここまでを追加
> End With
>
>'降順に並べ替え
>With Sheets("Sheet4")
> .Activate
> 'データが1件以上あったら並び替えをする
> If .Range("A3") <> "" Then
> .Range("A1").Select
> Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
> End If
>End With
>End Sub
>
>これでも空白行を入れると
>.Range("A1").Select
> Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
>では最初の空白行以降は並び替えの対象にならないので
>.Range("A1").Select を全セルを対象にして .Cells.Select としなければなりません。
>また、この場合は並び替えられたら空白行は全て取り除かれます。
>ということで加工の対象となるデータは極力空白行を作ったりしない方がよいと思います。
>必要なら全て作業が終わってから表を整えるのが良いと思います。

【44542】Re:2項目の日付表示では
質問  素人じゅうすけ E-MAIL  - 06/11/21(火) 9:43 -

引用なし
パスワード
   ▼yata さん:
yataさん。こんにちわ。
再度の質問です。
このマクロでやってみたのですが、E列の数量の合計が出ないのです。’G列から取り出して・・・とありますが、E列の場合は式はどのようになるのでしょうか?また、A列の日付をすべて出すことについて、SHEET2のC列(始めには)日付がでて、その横からはSHEET1のB列の貨物番号が出てきます。
そして、いくつか打ち込んでみたのですが、SHEET2において、数量の大きいものから上から順に並びません。
yataさんもお忙しいとは思いますが、何卒、宜しくお願いします。(基準になる人名はSHEET1のD列にあります)
>素人じゅうすけ さん こんばんわ
>2項目の日付表示について
>C列に縦方向に表示ではなく、同じ行の右方向に表示でしたら割と簡単です。
>
>最初に提示した行挿入が無いコードに追加してください
>Sub Test2()
>Dim R As Long, r2 As Long '元データの行数と転記先の行番号
>Dim 人名 As String
>Dim Sum As Double
>R = UsedRange.Rows.Count
>
>人名 = InputBox("抽出する人")
>
>For Each Rng In Range(Range("C2"), Cells(R, 3))
> If Rng.Value = 人名 Then
>    'G列から取り出して合計する
>    Sum = Sum + Rng.Offset(0, 4).Value
>
> End If
>Next
>
> With Sheets("Sheet4")
>    r2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
>    .Cells(r2, 1) = 人名
>    .Cells(r2, 2) = Sum
>    For Each Rng In Range(Range("C2"), Cells(R, 3))    '●ここから
>      If Rng.Value = 人名 Then
>        日付 = Rng.Offset(0, -2)
>        .Cells(r2, 1).End(xlToRight).Offset(0, 1) = 日付
>      End If
>    Next                        '●ここまでを追加
> End With
>
>'降順に並べ替え
>With Sheets("Sheet4")
> .Activate
> 'データが1件以上あったら並び替えをする
> If .Range("A3") <> "" Then
> .Range("A1").Select
> Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
> End If
>End With
>End Sub
>
>これでも空白行を入れると
>.Range("A1").Select
> Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
>では最初の空白行以降は並び替えの対象にならないので
>.Range("A1").Select を全セルを対象にして .Cells.Select としなければなりません。
>また、この場合は並び替えられたら空白行は全て取り除かれます。
>ということで加工の対象となるデータは極力空白行を作ったりしない方がよいと思います。
>必要なら全て作業が終わってから表を整えるのが良いと思います。

【44568】Re:2項目の日付表示では
回答  yata  - 06/11/21(火) 22:46 -

引用なし
パスワード
   素人じゅうすけ さん こんばんわ

>再度の質問です。
>このマクロでやってみたのですが、E列の数量の合計が出ないのです。’G列から取り出して・・・とありますが、E列の場合は式はどのようになるのでしょうか?
Offset(0,4)の意味は分かりますか。
あなたは最初C列に人名が入っていると言われました。でG列はC列から見て4行右にあります。Rng はC列のセルです。
>>    'G列から取り出して合計する
>>    Sum = Sum + Rng.Offset(0, 4).Value
>>

また、A列の日付をすべて出すことについて、SHEET2のC列(始めには)日付がでて、その横からはSHEET1のB列の貨物番号が出てきます。
>そして、いくつか打ち込んでみたのですが、SHEET2において、数量の大きいものから上から順に並びません。
下記コードは標準モジュールにではなく、元データが入っているシートのコード欄に入れていますか?
標準モジュールなら、上から5行目
>R = UsedRange.Rows.Countを
R = ActiveSheet.UsedRange.Rows.Count にして、そのシートを開いて実行しないといけません。
>> With Sheets("Sheet4")
ここはあなたのBookの表示したい場所に変更しましたか?
>(基準になる人名はSHEET1のD列にあります)

>>2項目の日付表示について
>>C列に縦方向に表示ではなく、同じ行の右方向に表示でしたら割と簡単です。
>>
>>最初に提示した行挿入が無いコードに追加してください
>>Sub Test2()
>>Dim R As Long, r2 As Long '元データの行数と転記先の行番号
>>Dim 人名 As String
>>Dim Sum As Double
>>R = UsedRange.Rows.Count
>>
>>人名 = InputBox("抽出する人")
>>
For Each Rng In Range(Range("C2"), Cells(R, 3)) '人名が入っている列のデータ範囲です。
>> If Rng.Value = 人名 Then
    'G列から取り出して合計する 
    Sum = Sum + Rng.Offset(0, 4).Value '人名D列から見て数量E列はどの位置にありますか?
>>
>> End If
>>Next
>>
With Sheets("Sheet4")  '表示させるシート名は?
>>    r2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
>>    .Cells(r2, 1) = 人名
>>    .Cells(r2, 2) = Sum
    For Each Rng In Range(Range("C2"), Cells(R, 3)) 'ここももとでーたの人名が入っている場所
>>      If Rng.Value = 人名 Then
        日付 = Rng.Offset(0, -2) '人名セルから見て日付セルは何列左ですか?
>>        .Cells(r2, 1).End(xlToRight).Offset(0, 1) = 日付
>>      End If
>>    Next
>> End With
>>
>>'降順に並べ替え
>>With Sheets("Sheet4") '転記されていて並べ替えられるべきデータが入っているシート名を
>> .Activate
>> 'データが1件以上あったら並び替えをする
If .Range("A3") <> "" Then 'A3が空白ということはデータが1件だから並べ替えが必要ないですね。
>> .Range("A1").Select
>> Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
>> End If
>>End With
>>End Sub
----------------------------------------------------------
 A            D     E
日付            人名    数量
8月29日            A    100
8月30日            C    1
9月1日            D    1000
9月3日            A    200
9月5日            B    50
9月29日            F    30
9月30日            B    20
10月1日            C    2
10月2日            A    300

うまく修正できたら InputBoxで人名A,B,Dの順番で実行
  A      B      C      D      E
人名    数量    日付        
D    1000    2006/9/1        
A    600    2006/8/29    2006/9/3    2006/10/2
B    70    2006/9/5    2006/9/30

【44590】Re:2項目の日付表示では
お礼  素人じゅうすけ E-MAIL  - 06/11/22(水) 17:40 -

引用なし
パスワード
   ▼yata さん:
yataさん、こんばんわ。
有難うございました。早速これでやってみます。
>素人じゅうすけ さん こんばんわ
>
>>再度の質問です。
>>このマクロでやってみたのですが、E列の数量の合計が出ないのです。’G列から取り出して・・・とありますが、E列の場合は式はどのようになるのでしょうか?
>Offset(0,4)の意味は分かりますか。
>あなたは最初C列に人名が入っていると言われました。でG列はC列から見て4行右にあります。Rng はC列のセルです。
>>>    'G列から取り出して合計する
>>>    Sum = Sum + Rng.Offset(0, 4).Value
>>>
>
>また、A列の日付をすべて出すことについて、SHEET2のC列(始めには)日付がでて、その横からはSHEET1のB列の貨物番号が出てきます。
>>そして、いくつか打ち込んでみたのですが、SHEET2において、数量の大きいものから上から順に並びません。
>下記コードは標準モジュールにではなく、元データが入っているシートのコード欄に入れていますか?
>標準モジュールなら、上から5行目
>>R = UsedRange.Rows.Countを
>R = ActiveSheet.UsedRange.Rows.Count にして、そのシートを開いて実行しないといけません。
>>> With Sheets("Sheet4")
>ここはあなたのBookの表示したい場所に変更しましたか?
>>(基準になる人名はSHEET1のD列にあります)
>
>>>2項目の日付表示について
>>>C列に縦方向に表示ではなく、同じ行の右方向に表示でしたら割と簡単です。
>>>
>>>最初に提示した行挿入が無いコードに追加してください
>>>Sub Test2()
>>>Dim R As Long, r2 As Long '元データの行数と転記先の行番号
>>>Dim 人名 As String
>>>Dim Sum As Double
>>>R = UsedRange.Rows.Count
>>>
>>>人名 = InputBox("抽出する人")
>>>
>For Each Rng In Range(Range("C2"), Cells(R, 3)) '人名が入っている列のデータ範囲です。
>>> If Rng.Value = 人名 Then
>    'G列から取り出して合計する 
>    Sum = Sum + Rng.Offset(0, 4).Value '人名D列から見て数量E列はどの位置にありますか?
>>>
>>> End If
>>>Next
>>>
> With Sheets("Sheet4")  '表示させるシート名は?
>>>    r2 = .Range("A65536").End(xlUp).Offset(1, 0).Row
>>>    .Cells(r2, 1) = 人名
>>>    .Cells(r2, 2) = Sum
>    For Each Rng In Range(Range("C2"), Cells(R, 3)) 'ここももとでーたの人名が入っている場所
>>>      If Rng.Value = 人名 Then
>        日付 = Rng.Offset(0, -2) '人名セルから見て日付セルは何列左ですか?
>>>        .Cells(r2, 1).End(xlToRight).Offset(0, 1) = 日付
>>>      End If
>>>    Next
>>> End With
>>>
>>>'降順に並べ替え
>>>With Sheets("Sheet4") '転記されていて並べ替えられるべきデータが入っているシート名を
>>> .Activate
>>> 'データが1件以上あったら並び替えをする
> If .Range("A3") <> "" Then 'A3が空白ということはデータが1件だから並べ替えが必要ないですね。
>>> .Range("A1").Select
>>> Selection.Sort Key1:=.Range("B2"), Order1:=xlDescending
>>> End If
>>>End With
>>>End Sub
>----------------------------------------------------------
> A            D     E
>日付            人名    数量
>8月29日            A    100
>8月30日            C    1
>9月1日            D    1000
>9月3日            A    200
>9月5日            B    50
>9月29日            F    30
>9月30日            B    20
>10月1日            C    2
>10月2日            A    300
>
>うまく修正できたら InputBoxで人名A,B,Dの順番で実行
>  A      B      C      D      E
>人名    数量    日付        
>D    1000    2006/9/1        
>A    600    2006/8/29    2006/9/3    2006/10/2
>B    70    2006/9/5    2006/9/30

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