dポイントプレゼントキャンペーン実施中!

初心者です。
関数等を使えば簡単ですが、データがある分を取得しマクロで一発で作成したいです。

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列に入力されていない行を判定して上記①か②が適用されるようにしたいです。

すいませんが、よろしくお願いいたします。

「Excelで行データがあるセルから最終セ」の質問画像

質問者からの補足コメント

  • すいません、深い事を言うと、VBAで他のシートから転記してきたデータなのでそのあとの処理をどうしてもマクロで実行を実現したいのです。 通常であればユーザ定義関数もありですよね。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/06/22 00:22
  • wS.Cells(maxRow, "C:C").Value = "良好"
    と記述すると、C2のみ"良好"という値が入ることを確認しましたが、図では、データがある分となると、C2~C15に"良好"と値が入るようにしたいのですがどのように記述すればよろしいのでしょうか?マジレスでお願いいたします。

      補足日時:2016/06/22 00:31
  • ご回答ありがとうございます。
    単純にコードでSheet2のデータをSheet1へデータ分をコピーして
    最終行へ貼り付ける処理をします。

    その後、
    ①Sheet1のC列の行があるデータ分に全て、value = ”良好”にて入力する。
    もしくは、
    ②Sheet1のC列の行があるデータ分に全て、C列に関数(ifなど)を使って80以上なら、”良好”、80以下なら、”不良”と関数値を入力したいのです。

    コピーする際にデータ行を取得し先に処理する方が良いか、
    コピーした後にコピー行数をカウントし①もしくは②の処理をさせたいのです。

    少し難しい表現で申訳けございません<(_ _)>

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/06/23 00:39
  • <事前にコピーする際のコード一例>
    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

      補足日時:2016/06/23 00:42

A 回答 (6件)

<事前にコピーする際のコード一例>をベースにするのであれば、こんな感じになると思います。



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
    • good
    • 0
この回答へのお礼

想定通りできました!ありがとうございます。ちなみにMsgBoxで数字表示が出るのですが15行カウント表示する事ですね。
ちなみに、ひたすら、”良好”文字を入力するにはFormulaR1C1を変更し、Valueで値入力すればよいのでしょうか?

お礼日時:2016/06/30 00:09

こんにちは。



とりあえず、コードの話からですから、少し気になる点が存在します。いえ、根本的に、最近、あちこちで似たようなコードを見るのですが、なぜなのか、と思います。どうでもよいかもしれませんが、元のコードがある気がします。

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
    • good
    • 0

No.4ママチャリです。


Msgboxの行数表示は、確認のためのデバッグコーディングの消し忘れですので、削除して下さい。失礼しました。
ひたすら「良好」とする場合は、キュアティるさんのお考えで正しいです。難しく考えずに試してみて下さい。
    • good
    • 0

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代の女性ではありませんでした。
回答してしまい申し訳ありませんでした。
    • good
    • 0

こんにちは



文章からの印象とご提示のコードが一致しないので、なさりたいことが良くつかめませんが・・・

 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,"良好","不良"))
この回答への補足あり
    • good
    • 0

自作関数が早いかな。


ユーザー定義関数とも言います。
よく使うエクセル関数は、ユーザー定義関数として保存しておけば?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!