電子書籍の厳選無料作品が豊富!

【やりたい事】
Q1.コードを実行し、C1-C3セルに、数式を以下のように入れたいです
現在は、=EXACT(A1,B1) が3つのセルに入っています

C1セル⇒=EXACT(A1,B1)
C2セル⇒=EXACT(A2,B2)
C3セル⇒=EXACT(A3,B3)

Q2.最終行の宣言におけるデータ型は、Dim surveydatalastrow As Integerで
あっていますか?
※Integer 整数型 -32,768 ~ 32,767

上記2つについて、ご存じの方、ご指導お願いします

【コード】
Sub exact関数()

Dim surveydatalastrow As Integer

lastrow = Cells(Rows.Count, 2).End(xlUp).Row

For i = 1 To lastrow

If Cells(i, 2) <> "" Then

Cells(i, 3).Formula = "=EXACT(A1,B1)"

End If

Next i

End Sub

A 回答 (2件)

以下のコードをご覧ください。


Option Explicit
Sub exact関数()
Dim lastrow As Long
lastrow = Cells(Rows.Count, 2).End(xlUp).Row
'Cells(1, "C").Resize(lastrow).Formula = "=IF(B1="""","""",EXACT(A1,B1))" 'fujillinさんの回答と同等
Range("C1:C" & lastrow).Formula = "=IF(B1="""","""",EXACT(A1,B1))" '別の表記方法(スピルなし)
'Cells(1, 3).Formula2 = "=IF(B1:B" & lastrow & "="""","""",EXACT(A1:A" & lastrow & ",B1:B" & lastrow & "))" 'スピルあり
End Sub

「Option Explicit」 は、VBAにおいて変数の宣言を強制するためのオプションステートメントです。これをモジュールの先頭に記述すると、すべての変数を「Dim」などで明示的に宣言しないと使用できなくなります。宣言漏れや、タイプミスによるバグを防ぐことができます。
ループ処理を回して、結果を表示したら0になってしまい、首をひねったら、原因は変数名をタイプミスして「空の変数」を表示していたというような笑い話を防げます。
失礼な言い方になるかもしれませんが、コードを書き始めの方は「モジュールの先頭にOption Explicit記述する」という癖をつけることをお勧めしたいと思います。

前置きはさておき、ご質問者のコードはB列の値が空白以外なら、A列とB列のEXACT関数による文字列比較結果をC列に表示するというものだと推測しました。
上記コードでは元々ご質問者のコードにあったFOR~NEXTの部分を削除しています。
その上で、B列が空白のときはC列には空白を表示するという数式に変えて、対象範囲に一気に適用する処理にしています。

方法を3通り、お示ししており、
fujillinさんの回答と同等のコード
Cells(1, "C").Resize(lastrow).Formula = "=IF(B1="""","""",EXACT(A1,B1))"  

別の表記方法(スピルなし) のコード
Range("C1:C" & lastrow).Formula = "=IF(B1="""","""",EXACT(A1,B1))"        
別の方法(スピルあり) のコード
Cells(1, 3).Formula2 = "=IF(B1:B" & lastrow & "="""","""",EXACT(A1:A" & lastrow & ",B1:B" & lastrow & "))"

最初にお示ししたコードは、上記のうち2つをコメントアウトしてありますので、コメントアウトを変更してみて、お好みのものを選択してください。
    • good
    • 0

こんにちは



最終的に表示させたい内容が正確には読み取れませんけれど・・

複数の連続セルに関数式を設定するのなら、まとめて入力したほうが簡単ですし、処理も速いはずです。
具体的には(式を少し変えていますが)、
Cells(1,3).Resize(lastrow)..Formula = "=IF(B1="""","""",EXACT(A1,B1))"
みたいな感じです。


>最終行の宣言におけるデータ型は、Dim surveydatalastrow As Integer
>であっていますか?
ご提示のコードの範囲内では、変数surveydatalastrowは使用していないようです。
ですので、宣言する必要はありません。
それでも、宣言したいのであれば、宣言のみ(=使用していない)なので、どのような宣言でも問題はありません。

一方で、使っている変数(=i および lastlow)は宣言していませんよね?
宣言を考えるのなら、そちらの方がまず先でしょう。
なお、行数を変数に入れる場合、現在のエクセルの最大行数は1048576行なので、Integer宣言だとオーバーフローする可能性があります。
Long型にしておくのが安全でしょう。
    • good
    • 1

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

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


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