初心者です。
関数等を使えば簡単ですが、データがある分を取得しマクロで一発で作成したいです。
If .Cells(Rows.Count, "C").End(xlUp).Row > 1 Then
maxRow = wS.UsedRange.Rows.Count + 1
↑こんな感じでしょうか?
①Excelで行に何かデータがある分だけを取得し、例えばC列に同じ文字”良好”と値を入力したいです。
また、
②Excelで行に何かデータがある分だけを取得し、例えばC列に関数(ifなど)を使って80以上なら、”良好”、80以下なら、”不良”と値を入力したいです。 (=IF(B2>=80,"良好","不良"))
ただし、C列は空白であるか調べて空白だった場合のみに適用するという事にしたいです。
その後、後から行データを入力したところから、マクロを走らせてC列に入力されていない行を判定して上記①か②が適用されるようにしたいです。
すいませんが、よろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
<事前にコピーする際のコード一例>をベースにするのであれば、こんな感じになると思います。
Sub sample()
Dim i As Long, lastRow As Long, maxRow As Long, wS As Worksheet
Set wS = Worksheets("Sheet1")
With Worksheets("Sheet2")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
MsgBox wS.Cells(Rows.Count, "A").End(xlUp).Row
'If wS.Cells(Rows.Count, "A").End(xlUp).Row > 1 Then
maxRow = wS.UsedRange.Rows.Count + 1
Range(.Cells(2, "A"), .Cells(lastRow, "D")).Copy wS.Cells(maxRow, "A")
wS.Range(Cells(maxRow, "C"), Cells(maxRow + lastRow - 2, "C")). _
FormulaR1C1 = "=IF(RC[-1]>=80,""良好"",""不良"")"
' …
'End If
End With
End Sub
想定通りできました!ありがとうございます。ちなみにMsgBoxで数字表示が出るのですが15行カウント表示する事ですね。
ちなみに、ひたすら、”良好”文字を入力するにはFormulaR1C1を変更し、Valueで値入力すればよいのでしょうか?
No.6
- 回答日時:
こんにちは。
とりあえず、コードの話からですから、少し気になる点が存在します。いえ、根本的に、最近、あちこちで似たようなコードを見るのですが、なぜなのか、と思います。どうでもよいかもしれませんが、元のコードがある気がします。
maxRow = wS.UsedRange.Rows.Count + 1
maxRow は、誤動作しないのでしょうか。あやうい(定まらない)感じがしてくるのです。
シート2のデータを、シート1の最後尾につけて貼り付けるなら、
私なら、こんなふうに書きます。
'//'
Sub Test2()
Dim maxRng As Range, LastRow As Long
Dim wsh As Worksheet
Set wsh = Worksheets("Sheet1")
Set maxRng = wsh.Cells(Rows.Count, "A").End(xlUp).Offset(1)
With Worksheets("Sheet2")
LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
.Range("A2").Resize(LastRow - 1, 4).Copy maxRng
End With
maxRng.Offset(, 2).Resize(LastRow - 1).FormulaLocal _
= "=IF(RC[-1]>=80,""良好"",""不良"")"
' maxRng.Offset(, 2).Resize(LastRow - 1).Value =" 良好"
End Sub
No.5
- 回答日時:
No.4ママチャリです。
Msgboxの行数表示は、確認のためのデバッグコーディングの消し忘れですので、削除して下さい。失礼しました。
ひたすら「良好」とする場合は、キュアティるさんのお考えで正しいです。難しく考えずに試してみて下さい。
No.3
- 回答日時:
ANo2です
少々、辛口になってしまいますが…
何度読んでも
・関数でなくマクロで処理しなければならない必然性
・別のマクロを新たに作成しなければならない必然性
がわかりません。
>wS.Cells(maxRow, "C:C").Value = "良好"
>と記述すると、C2のみ"良好"という値が入ることを確認しましたが
Cells(maxRow, "C:C") が私には意味不明ですが、エクセルは解釈してくれているようですね。
でも、行をmaxRowと指定しているので、必ずしも2行目とは限らないはずです。
ただし、セルの個数は一つであることには変わりありません。
将来のメンテナンスなどを考慮すれば
>関数等を使えば簡単ですが
とおっしゃっている通りですので、関数で処理する方法をお勧めします。
というのも、質問者様はVBAをほとんど理解なさっていないようですので、例えば、80の区切りを70に変えたいとか、判定を3段階にして「優良」「良好」「不良」と評価するようにしたいなどといった要望が出ても、VBAでは対処できないであろうと想像するからです。
ところで、ANo2の方法を試してみましたか?
ついでながら、以下はあまり役には立たないと思いますが、VBAに関して。
>データがある分となると、C2~C15に"良好"と値が
>入るようにしたいのです
無条件で”良好”の文字を入力したいだけであれば、ご提示のマクロ(一例?)の中で、値を入力したらその隣のセルに"良好"と入れればすむみますので、
wS.Cells(maxRow, "B").Resize(Range(.Cells(2, "A"), .Cells(lastRow, "A")).Rows.Count, 1) = "良好"
の1行を追加すれば済むはずです。(↑要領の悪い書き方ですが・・・)
でも、ご提示の「一例」のコーでドはwithの範囲指定がおかしいので、そのままでは動作しないと思いますが…?
さらには、sheet1のタイトル行?(=A1セル)が空白の場合には、想像するところ、意図通りに動作しないのではないかと懸念します。(空白なことはありえないのかも知れませんけれど・・・)
あっ、20代の女性ではありませんでした。
回答してしまい申し訳ありませんでした。
No.2
- 回答日時:
こんにちは
文章からの印象とご提示のコードが一致しないので、なさりたいことが良くつかめませんが・・・
1)B列に値があればその数字によって、良好/不良の表示をしたい。
(ご提示のコードではC列の入力有無を判定しているようですが…??)
2)C列は値を直接入力しても良いし、セルに関数を設定しても良い。
3)関数を使わずに、VBAで処理したい。
・・・ということかと想像しましたが、2)と3)には矛盾があるような気がします。
>その後、後から行データを入力したところから、マクロを走らせてC列に
>入力されていない行を判定して上記①か②が適用されるようにしたいです
深読みすると、上記1)~3)のルールに合致しない値がC列に入力される可能性があるので、その場合はスキップしたいという意味なのでしょうか?
それとも、単に、C列は全てルール通りの表示になるということで良いのでしょうか?
なんとなく後者のような気がしますが、それなら、後から処理する必然性はまったくないですよね?
(関数を先に設定しておいて、違う値で上書きすれば、結果的に前者を実現したい場合でもそうなりますよね)
>深い事を言うと、VBAで他のシートから転記してきたデータなの
>でそのあとの処理をどうしてもマクロで実行を実現したいのです。
普通に考えると、なぜ後から処理をしたいのかの理由がわかりません。
先に関数で『B列に値がある場合は、80を境に良好/不良を表示する』というものをC列に設定しておけば、B列へ値を入力すると自動的に反映されるので、VBAの必要がなくなると思いますけれど・・・私が何か勘違いしてるのかな?
あるいは、VBAでB列にデータを入力した時に、併せてC列に関数(又は直接に良好/不良の値)をセットするようにしておけば、ご質問のVBAを別途走らせる必要もなくなるように思いますが・・・
ご質問の内容は、VBAでやっても大したものではないと思いますが、内容や必然性がよくわからないので、とりあえず関数でやる方法のみをご参考までに提示しておきます。
C2セルに以下の式を入れて、C列にフィルコピーしておく
(ご質問文で「80以上」、「80以下」となっていて、境界が不明瞭なのでそこは適当)
=IF(B2="","",IF(B2>80,"良好","不良"))
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) Excelにて、シート1の行を削除するとシート2のシート1と同じ番号の行も削除したい 3 2022/05/08 04:24
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) 【VBA】Excelで罫線を引きたい 3 2022/07/14 12:04
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- Visual Basic(VBA) 追記する列を増やしたい 2つのデータを検索・照合して元データにないデータを下記マクロで商品名を追記し 9 2022/10/05 10:50
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VBA】条件に一致しない行を削...
-
エクセルで空白行を削除する ...
-
【VBA】条件に一致しない行を削...
-
エクセルのデータがない行には...
-
VB.net
-
VBAで特定の行と一つ上の行を削...
-
マクロで最終行を取得してコピ...
-
【至急】Excel 同一人物の情報...
-
数値に見えるものはすべて数値...
-
Excel97 指定した行だけマク...
-
Excel マクロ 検索結果を別シ...
-
Access2003レポート:最終ペー...
-
列から特定の文字列検索→該当以...
-
エクセルのVBAで指定した行数の...
-
VBAでの重複データに色付け
-
条件に合った行を削除するマク...
-
【VBA】指定月のオートフィルタ...
-
VBA 行削除した連番
-
Excel VBAでオートフィルタで抽...
-
EXCEL VBAでA列にある空白行よ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで空白行を削除する ...
-
数値に見えるものはすべて数値...
-
エクセルのデータがない行には...
-
マクロで最終行を取得してコピ...
-
【VBA】条件に一致しない行を削...
-
【VBA】条件に一致しない行を削...
-
エクセルのVBAで指定した行数の...
-
VB.net
-
Excel VBAでオートフィルタで抽...
-
マクロにて指定の文字間の文字...
-
Excel97 指定した行だけマク...
-
EXCEL VBAでA列にある空白行よ...
-
excel2021で実行できないマクロ...
-
Excel 別ブックから該当データ...
-
VBAでの重複データに色付け
-
Excel VBA オートフィルタの結...
-
エクセルで階層図を作る方法
-
VBAで特定の行と一つ上の行を削...
-
【至急】Excel 同一人物の情報...
-
Excelで、マウスで範囲を選択し...
おすすめ情報
すいません、深い事を言うと、VBAで他のシートから転記してきたデータなのでそのあとの処理をどうしてもマクロで実行を実現したいのです。 通常であればユーザ定義関数もありですよね。
wS.Cells(maxRow, "C:C").Value = "良好"
と記述すると、C2のみ"良好"という値が入ることを確認しましたが、図では、データがある分となると、C2~C15に"良好"と値が入るようにしたいのですがどのように記述すればよろしいのでしょうか?マジレスでお願いいたします。
ご回答ありがとうございます。
単純にコードでSheet2のデータをSheet1へデータ分をコピーして
最終行へ貼り付ける処理をします。
その後、
①Sheet1のC列の行があるデータ分に全て、value = ”良好”にて入力する。
もしくは、
②Sheet1のC列の行があるデータ分に全て、C列に関数(ifなど)を使って80以上なら、”良好”、80以下なら、”不良”と関数値を入力したいのです。
コピーする際にデータ行を取得し先に処理する方が良いか、
コピーした後にコピー行数をカウントし①もしくは②の処理をさせたいのです。
少し難しい表現で申訳けございません<(_ _)>
<事前にコピーする際のコード一例>
Dim i As Long, lastRow As Long, maxRow As Long, wS As Worksheet
Set wS = Worksheets("Sheet1")
With Worksheets("Sheet2")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
End With
If .Cells(Rows.Count, "A").End(xlUp).Row > 1 Then
maxRow = wS.UsedRange.Rows.Count + 1
Range(.Cells(2, "A"), .Cells(lastRow, "A")).Copy wS.Cells(maxRow, "A")
…
End If