VBAでA列がBかつC列がDならE列がFという風なマクロを書きたいです。

Sub tesuto()


If Columns("A").Value = "B" And Columns("C").Value = "D" Then
Columns("E") = F
End If

End Sub

などめちゃくちゃにしか分かりません。
勉強もろくにしていない初心者の不躾な質問で申し訳ありませんが、教えていただけますとうれしいです。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

こんにちは!



ループさせるのが一番オーソドックスだと思います。
一例です。

Sub Sample1()
Dim i As Long
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
If Cells(i, "A") = "B" And Cells(i, "C") = "D" Then
Cells(i, "F") = "E"
End If
Next i
End Sub

※ 1行目~A列最終行までループさせています。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます!
応用して使うことができました。

お礼日時:2017/04/17 13:05

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q(COUNTIFS ?)B列に任意の値があり、D列からF列の間にも任意の値がある場合に値を返す関数式

会社で修理業者に物品の修理を依頼する仕事をしているのですが、修理の際に出張費がかかる場合があり、余計な出費を避けるため、エクセルで素早くチェックできるようにしたいと思っております。

添付ファイルのとおり、任意の行のB列と同じ値が他の行のB列にあって(業者名が同じで)、かつ、その行の修理日・修理日2・修理日3のいずれかの値から前後6日以内の値が他の行において修理日・修理日2・修理日3にあった場合に、G列に「調整」という文字が入るようにしたいと思っております。

どのように関数式を組めばよいのか、どなたかご教授願います。

Aベストアンサー

VBA で良かったでしょうか?
ダメならスルーということで

処理範囲の行は A3 ~ A列データのある行とします
行の範囲を求めたら、B列 ~ F列を配列に読み込みます
(C列は非表示?)
修理業者をベースに Dictionary にデータを覚えていきます
Dictionary は3段構成
1段目キー:修理業者名
2段目キー:行番号
3段目キー:日付

Dictionary に展開できたら、
各修理業者の異なる行番号での日付差をグルグルチェックしていきます

※ B列 ~ F列を読み込んだ配列 vA は、
Dictionary に覚えたら不要になるので、
vA の1列目を結果書き出し用に再利用しています


Public Sub Samp1()
  Dim dic As Object
  Dim vA As Variant, vK As Variant
  Dim vRp As Variant, vRc As Variant
  Dim vDp As Variant, vDc As Variant
  Dim i As Long, j As Long
  Dim bSkip As Boolean
  Const CDAYW As Long = 6
  Const CMOJI As String = "調整"

  Set dic = CreateObject("Scripting.Dictionary")

  With Range("A3", Cells(Rows.Count, "A").End(xlUp))
    vA = .Columns("B:F").Value
    For i = 1 To UBound(vA)
      If (vA(i, 1) <> "") Then
        For j = 3 To UBound(vA, 2)
          If (vA(i, j) <> "") Then
            If (Not dic.Exists(vA(i, 1))) Then
              dic.Add vA(i, 1) _
                , CreateObject("Scripting.Dictionary")
            End If
            If (Not dic(vA(i, 1)).Exists(i)) Then
              dic(vA(i, 1)).Add i _
                , CreateObject("Scripting.Dictionary")
            End If
            dic(vA(i, 1))(i)(vA(i, j)) = Empty
          End If
        Next
        vA(i, 1) = ""
      End If
    Next

    For Each vK In dic.Keys
      For Each vRp In dic(vK).Keys
        If (vA(vRp, 1) = "") Then
          bSkip = False
          For Each vDp In dic(vK)(vRp).Keys
            For Each vRc In dic(vK).Keys
              If (vRp <> vRc) Then
                For Each vDc In dic(vK)(vRc).Keys
                  i = Abs(DateDiff("d", vDp, vDc))
                  If (i <= CDAYW) Then
                    vA(vRp, 1) = CMOJI
                    vA(vRc, 1) = CMOJI
                    bSkip = True
                    Exit For
                  End If
                Next
                If (bSkip) Then Exit For
              End If
            Next
            If (bSkip) Then Exit For
          Next
        End If
      Next
    Next
    .Columns("G").Value = vA
  End With

  Set dic = Nothing
End Sub

VBA で良かったでしょうか?
ダメならスルーということで

処理範囲の行は A3 ~ A列データのある行とします
行の範囲を求めたら、B列 ~ F列を配列に読み込みます
(C列は非表示?)
修理業者をベースに Dictionary にデータを覚えていきます
Dictionary は3段構成
1段目キー:修理業者名
2段目キー:行番号
3段目キー:日付

Dictionary に展開できたら、
各修理業者の異なる行番号での日付差をグルグルチェックしていきます

※ B列 ~ F列を読み込んだ配列 vA は、
Dictionary に覚えたら不要になるので、
...続きを読む

Qエクセルで、A列に日付をB列に曜日、C列からF列までにデータを入れるよ

エクセルで、A列に日付をB列に曜日、C列からF列までにデータを入れるように作成しています。
条件付書式で土日祭日の場合はC列からF列に色を表示させています。
この色付セル(土日祭日)の場合にはデータ入力が無いので自動で0を表示させ、なおかつデータ入力が出来ないようにしたいのですが、そのようなことは出来るでしょうか。エクセルは2003を使ってます。

Aベストアンサー

C2セルに以下の数式を入力します。

=IF(AND($A2<>"",WEEKDAY($A2,2)>5),0,"")

同様にC2セルに以下の入力規則を設定します。

「データ」「入力規則」で「ユーザー設定」にして数式欄に以下の式を入力します。

=WEEKDAY($A2,2)<6

最後にC2セルを右方向および下方向にオートフィルします。

Q#If Then ~ #Else ~ #End If(エクセルVBA)

#If Then ~ #Else ~ #End If
って何ですか?
また、VBAのヘルプで検索する方法ってどうすればいいのですか?
どなたか?宜しくお願い致します。

Aベストアンサー

単純にヘルプのコピペです。

> #If Then ~ #Else ~ #End If
式の値に基づいて、条件付きのコンパイルを行います。

ヘルプの使用方法であれば、
VBAのコードを打つ画面で、#Ifの#またはIの後ろで「F1(ファンクション1)」を入力ください。

そうすると、参照先の先が自動的に出てきます。

今更聞きにくいヘルプの使用法ですね・・・。

HLPファイルの時は簡単に検索できたんですけどね。

QVBA .Value=.Value ?

とある質問の回答の中で
With セル範囲
 .Formula = "=~式の中身は省略"
 .Value = .Value  '←これ
End With
というものがありました。これは一体どういう働きをするのでしょうか?With を使わずに書くと
Range("A1:C3").Formula="=~"
Range("A1:C3").Value=Range("A1:C3").Value
初めて見ました。

Aベストアンサー

こんにちは。

With セル範囲
 .Formula = "=~式の中身は省略"
 .Value = .Value  '←これ
End With

OkWaveとの分離前に、こういうのを好んで書く人がいましたね。
ループとどちらが速いか、複雑なものでは、こちらの方が速いかもしれません。これは、一種の裏ワザなのです。

#1の方が、mougでの紹介をしていますが、ちょっと違うというか足らないです。(私が、このテクニックを、代弁するというのもおかしな話しなのですが、私も使わないというわけではありません。ただ、あまり格好のよいテクニックでもありません。)

>Range("A1:C3").Formula="=~"  '←ここに複雑な数式を置きます。
>Range("A1:C3").Value=Range("A1:C3").Value

複雑な計算を、Excelのスプレッドシート側にまかせてしまい、後は、その数式が揮発性だったり、そのために重く重くなるのを防ぐために、値貼り付けにしてしまう、という目論見なのです。マクロで、その数式の役割をさせるよりも、実際の数式のほうが楽だからということもあります。例えば、配列数式などが使われたりします。

「Range("A1:C3").Value」の右辺の値を変数で受けて、中身を調べれば分かりますが、配列の中は、数式ではなく、数値または文字列として、格納されています。Rangeオブジェクトにして初めて、数式を格納できるわけです。そして、右辺の値は、2次元配列になって、同じ構造を持つ左辺の範囲に出力されるというわけです。

こんにちは。

With セル範囲
 .Formula = "=~式の中身は省略"
 .Value = .Value  '←これ
End With

OkWaveとの分離前に、こういうのを好んで書く人がいましたね。
ループとどちらが速いか、複雑なものでは、こちらの方が速いかもしれません。これは、一種の裏ワザなのです。

#1の方が、mougでの紹介をしていますが、ちょっと違うというか足らないです。(私が、このテクニックを、代弁するというのもおかしな話しなのですが、私も使わないというわけではありません。ただ、あまり格好のよいテク...続きを読む

Qエクセルの関数を教えて下さい。 例 シート3 11月の売上集計 A 列 B列 C列 D列 1行 い

エクセルの関数を教えて下さい。

例 シート3 11月の売上集計
A 列 B列 C列 D列
1行 い ろ は
2行 りんご 3 2 4‥
3行 累計 15 12 13‥
4行 みかん 2 5 6‥
5行 累計 12 14 16‥
と売上の集計が続いています。
この時、2行目と4行目は手入力してます。
B3は=B2+10月シートB3となります。
C3はC2+10月シートC3となります。
5行目も同様です。
このシートをコピーして12月分を作った時、
B3は=B2+10月シートB3の10月を11月に
変更してます。
自動的に変更できる方法はないですか❓

Aベストアンサー

11月の
>シートをコピーして12月分を作った時、
>B3は=B2+10月シートB3の10月を11月に
>変更してます。
>自動的に変更できる方法はないですか❓
…と言う事ですか?
ならば月の数字をいじれば良いだけですので、CELL関数でシート名を取得して、それを加工しましょう。

 =CELL("filename",A1)
これで、このCELL関数が使われたシート名を含んだ文字列を取得できます。
 C:\Users\あさご\Documents\Excel_file\[売り上げとか.xlsx]12月の売上集計
のような値が返ってきますので、ファイル名の後ろにある「 ] 」の位置をFIND関数で見つけて、その次の文字から最後の文字までをシート名としてMID関数などで切り出し、
”月の売上集計”をSUBSTITUTE関数で削除する(空欄に置き換える)か、得られたシート名の先頭から「月」の文字の前の文字までを別途切り出す。
これで月の数字の部分を得ることができます。
あとはこの数字を足したり引いたりしてINDIRECT関数に入れて参照したいシート名にすればよいです。
1月には12月のシートを参照したいという事になるでしょうから、そのあたりも考慮して作りましょう。
(MOD関数を使うと良いかもしれない)

11月の
>シートをコピーして12月分を作った時、
>B3は=B2+10月シートB3の10月を11月に
>変更してます。
>自動的に変更できる方法はないですか❓
…と言う事ですか?
ならば月の数字をいじれば良いだけですので、CELL関数でシート名を取得して、それを加工しましょう。

 =CELL("filename",A1)
これで、このCELL関数が使われたシート名を含んだ文字列を取得できます。
 C:\Users\あさご\Documents\Excel_file\[売り上げとか.xlsx]12月の売上集計
のような値が返ってきますので、ファイル名の後ろ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報