• ベストアンサー

エクセルマクロ コピーして数値を置き換えてペースト

下記内容のマクロをご教示願います。 ①「元データ」シートの最下行のデータをコピーして「変換データ」シートの最下行の次行 にペースト ②その際、以下のルールでペースト 0~9.9→1(データが0~9.9の場合、1に置き換える。以下同じ) 10.0~19.9→10 20.0~29.9→20 ・ ・ ・ 90.0~99.9→90 100.0以上→100 ※データは0.1刻み(小数点第1位が「0」の場合は整数で表記)

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1747/2623)
回答No.4

> データが複数列に渡る場合 列がどこから始まるのか不明ですが、範囲がA列からデータのある右端の列までとした場合 (A列でなければ ws1.Columns("A") や .Cells(Rows.Count, "A") のAを実際の列にしてください) Sub Test() Dim ws1 As Worksheet, ws2 As Worksheet Dim ws1LastRow As Long, ws2LastRow As Long Dim mCol As Long Set ws1 = Sheets("元データ") Set ws2 = Sheets("変換データ") ws1LastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row ws2LastRow = ws2.Cells(Rows.Count, "A").End(xlUp).Row For mCol = ws1.Columns("A").Column To ws1.Cells(ws1LastRow, Columns.Count).End(xlToLeft).Column If ws1.Cells(ws1LastRow, mCol).Value < 10 Then ws2.Cells(ws2LastRow + 1, mCol).Value = 1 ElseIf ws1.Cells(ws1LastRow, mCol).Value >= 100 Then ws2.Cells(ws2LastRow + 1, mCol).Value = 100 Else ws2.Cells(ws2LastRow + 1, mCol).Value = Int(ws1.Cells(ws1LastRow, mCol).Value / 10) * 10 End If Next Set ws1 = Nothing Set ws2 = Nothing End Sub

KIKAIDER01
質問者

補足

ありがとうございます。ベリーグッドです。最後に下記のマクロはどのような処理をしているか詳解していただければ幸いです。 ws2.Cells(ws2LastRow + 1, mCol).Value = Int(ws1.Cells(ws1LastRow, mCol).Value / 10) * 10

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • panja2021
  • ベストアンサー率10% (6/58)
回答No.6

pythonを使ってみてはどうでしょうか? https://tonari-it.com/python-clipboard-excel/

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1747/2623)
回答No.5

Int(ws1.Cells(ws1LastRow, mCol).Value / 10) * 10 Int(数値) 数値の小数を切り捨てます。 なので56.3の場合 56.3/10=5.63 Int(5.63)=5 で 5*10=50 になります。 セルのROUNDDOWN関数を以下のようにすると使えますが WorksheetFunction.RoundDown(ws1.Cells(ws1LastRow, mCol).Value, -1) でWorksheetFunction.RoundDownとタイプするのが面倒なのでIntにしました。 マイナスがあった場合、RoundDownと同じ結果になるのはFixになります。 惰性でIntにしましたが、プラスマイナスに関係なく整数部分を取り出すという感覚の場合は、IntよりFixにしておいた方が間隔に一致する動作だと思います。 Int(数値) 数値を超えない最大の整数を返す -5.63の小数部分をカットして-5にすると-5.63を超えるので超えない最大の-6になる Fix(数値) 数値から小数点以下を削除した整数を返す -5.63の小数部分をカットするだけなので-5になる

KIKAIDER01
質問者

お礼

詳細な解説をありがとうございます。とてもよくわかりました。

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1747/2623)
回答No.3

No.2の -100以下を全て-100にする場合は If文よりSelect Caseの方が見やすいかもしれません。 Select Case ws1.Cells(ws1LastRow, "A").Value Case 0 To 9.9 ws2.Cells(ws2LastRow + 1, "A").Value = 1 Case Is >= 100 ws2.Cells(ws2LastRow + 1, "A").Value = 100 Case Is <= -100 ws2.Cells(ws2LastRow + 1, "A").Value = -100 Case Else ws2.Cells(ws2LastRow + 1, "A").Value = Fix(ws1.Cells(ws1LastRow, "A").Value / 10) * 10 End Select

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1747/2623)
回答No.2

数値にマイナスがある場合は以下のようにしてください。 If ws1.Cells(ws1LastRow, "A").Value < 10 And ws1.Cells(ws1LastRow, "A").Value >= 0 Then ws2.Cells(ws2LastRow + 1, "A").Value = 1 ElseIf ws1.Cells(ws1LastRow, "A").Value >= 100 Then ws2.Cells(ws2LastRow + 1, "A").Value = 100 Else ws2.Cells(ws2LastRow + 1, "A").Value = Fix(ws1.Cells(ws1LastRow, "A").Value / 10) * 10 End If -12.2は-10 -103.1は-100 になります。 -100以下を全て-100にする場合には以下のようにしてください。 If ws1.Cells(ws1LastRow, "A").Value < 10 And ws1.Cells(ws1LastRow, "A").Value >= 0 Then ws2.Cells(ws2LastRow + 1, "A").Value = 1 ElseIf ws1.Cells(ws1LastRow, "A").Value >= 100 Then ws2.Cells(ws2LastRow + 1, "A").Value = 100 ElseIf ws1.Cells(ws1LastRow, "A").Value <= -100 Then ws2.Cells(ws2LastRow + 1, "A").Value = -100 Else ws2.Cells(ws2LastRow + 1, "A").Value = Fix(ws1.Cells(ws1LastRow, "A").Value / 10) * 10 End If

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1747/2623)
回答No.1

以下で試してみてください。 Sub Test() Dim ws1 As Worksheet, ws2 As Worksheet Dim ws1LastRow As Long, ws2LastRow As Long Set ws1 = Sheets("元データ") Set ws2 = Sheets("変換データ") ws1LastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row ws2LastRow = ws2.Cells(Rows.Count, "A").End(xlUp).Row If ws1.Cells(ws1LastRow, "A").Value < 10 Then ws2.Cells(ws2LastRow + 1, "A").Value = 1 ElseIf ws1.Cells(ws1LastRow, "A").Value >= 100 Then ws2.Cells(ws2LastRow + 1, "A").Value = 100 Else ws2.Cells(ws2LastRow + 1, "A").Value = Int(ws1.Cells(ws1LastRow, "A").Value / 10) * 10 End If Set ws1 = Nothing Set ws2 = Nothing End Sub

KIKAIDER01
質問者

補足

すいません、説明不足でした。データが複数列に渡る場合、一括して置き換えることは可能でしょうか?(数値がマイナスの場合も書いていただいてますが、数値は常に0より大きいです) 【例】 (元データ)3.1 11.4 30.7 56.3 34.2 9.5 16 134 116.7 ↓ (変換データ)1 10 30 50 30 1 10 100 100

すると、全ての回答が全文表示されます。

関連するQ&A