痔になりやすい生活習慣とは?

マクロを独学で学び仕事に応用しているのですが、どうしても分からないことが発生してしまい、質問です。

内容は、今、エクセルシートのA1~B5の範囲で

A B
1 1 1
2 1 2
3
4 1
5 1

という形で入力されています(見難くてスミマセン)。
この状態から「A列とB列に同じ数字が入力されてれば、メッセージBOXを表示して、なおかつOKボタンを押したら該当セルを赤くする」というマクロを作りたいのですが、本来であれば1行目のみ赤くなるはずなのですが、空白セルが含まれている3行目も赤くなってしまうんです。つまり、空白セルも「同じ値」と認識されているみたいなのですが...。
この場合、空白セルを無視するにはどうしたらよいのですか?教えてください。なお、マクロは以下のように作っています。

Sub ナンバーチェック()
Dim Btn As Integer
For X = 5 To 10
If Cells(X, "A").Value = Cells(X, "B").Value Then
 Btn = MsgBox("同じ数値です", vbOK, "警告")
 If Btn = vbOK Then
  Cells(X, "A").Interior.ColorIndex = 3
Cells(X, "B").Interior.ColorIndex = 3
End If
End If
Next
End Sub

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

A 回答 (11件中1~10件)

Sub ナンバーチェック()


Dim Btn As Integer
For X = 5 To 10
If Cells(X, "A").Value = Cells(X, "B").Value And Cells(X, "A") <> "" And Cells(X, "B")<>"" Then
Btn = MsgBox("同じ数値です", vbOK, "警告")
If Btn = vbOK Then
Cells(X, "A").Interior.ColorIndex = 3
Cells(X, "B").Interior.ColorIndex = 3
End If
End If
Next
End Sub

ではいかがでしょう?
paopao01さんのアイディアでほぼOKなのですが、Cell(X,"A").Value<>""の判断で".Value"をつけているために空欄は数値で0と判断されるため常に真となります。
.Valueを外せばOKです。
また、A列の値が0でB列が空欄という場合を排除するため、B列についても空欄かどうかの判断も付け加えてみました。
paopao01さんのNo.4にあるTrimについては、空欄に見えながらも実はスペースが入っている可能性があるならばつけておいた方がいいかもしれません。
    • good
    • 2
この回答へのお礼

おぉ!
ホントに.Valueをはずしただけで、空白セルがスキップされました!
ホントにありがとうございました~♪

お礼日時:2007/07/08 13:03

こんばんは。



#10さんの
>また、答え書きすぎなように思われます。

そうですね。ただ、私は、回答者さんたちのためにも書いたつもりだったのですが。

そして、#8のimogasiさんのようなワークシートによる記録マクロの方法もアリですね。

細かいことを言えばきりがないですが、私としては、こういう問題(空白とEmpty)は、昔、やはり人から教わったことです。そういう受け入れ態勢が出来て初めて分かることかもしれませんが、ちょっと気になって書いてしまいました。半分ぐらいの人は理解していないような気がします。

それと、
>(個人的にはif文で1行に書きすぎるとわかりにくく、追加しずらいです)

私もそう思います。IF文1行の条件文はしないほうがよいです。
本来、他の言語ですと、条件ごとに括弧( )で括るような書き方をします。

質問者さんは、#6さんの回答には、目をくれていませんが、本来は、それでよかったのですが……。ただし、私は、そういうようには書きません。それは、それぞれのレベルがあるからです。また、長さ0の文字列の意味が分からなければ、何もなりません。


Sub ナンバーチェックR()
  Dim x As Integer
  Dim btn As Integer
  
  For x = 5 To 10
    '以下の一行の条件文を入れる
    If Cells(x, "A").Value <> "" And Cells(x, "B").Value <> "" Then
    
      If Cells(x, "A").Value = Cells(x, "B").Value Then
        btn = MsgBox("同じ数値です", vbOK, "警告")
        If btn = vbOK Then
          Cells(x, "A").Interior.ColorIndex = 3
          Cells(x, "B").Interior.ColorIndex = 3
        End If
      End If
    '以下の一行でEnd Ifと括る
    End If
  Next x
End Sub


また、ちょっと記録マクロを使った使い方なら、こんな風にも出来ますね。これは、スピードが速いです。ただし、条件付書式です。

Sub FormatConditionUsed()
With Range("A5:B10")
   .FormatConditions.Delete '条件付書式の削除
   '条件付書式にて
   .FormatConditions.Add _
    Type:=xlExpression, _
    Formula1:="=AND(RC1=RC2,RC1<>"""",RC2<>"""")"
   .FormatConditions(1).Interior.ColorIndex = 3
  End With
End Sub
    • good
    • 0

no.1です


しばらくvb触っていないのでなんともいえませんが・・・
以下は複雑すぎるように思います。
単純に、serecut case(またはswich等で)
aの場合(yes)
bの場合(no)
それ以外(else)
の分岐で良いと思います。
.valueなどで得る値もnullや””とは限りません。
追加するときも、cを追加するだけです。
if文で多重分岐させるよりも、簡易でデバッグしやすいですし、if文で文字列との違いも追加しやすいです。
(個人的にはif文で1行に書きすぎるとわかりにくく、追加しずらいです)

また、答え書きすぎなように思われます。
これでは質問者の方が自得しにくいように思います。
できるだけヒントを与えて、プログラムはフリーにすべきです。
(これでなければいけない、といった決まりはないのですから・・)
基本的にifとfor文に頼りすぎると良くないように思います。

NO.9さんのゆうように、ローカルウィンドウで得る値を経験すべきと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!
serecut caseですね?
自分にとっては未知の数式でした。
とりあえず他の方の数式で問題は解決したのですが、自分の経験値アップのためにトライしてみます。
ありがとうございました。

お礼日時:2007/07/08 13:01

こんばんは。



今回の場合、別にエラー値を比較するようなこともないし、どちらでもよいことですが、もし、VBAの問題として、厳密なの空白セルの判定ということでしたら、ちょっと話が違ってきます。

まず、Cells(x,"A").Value も Cells(x,"A") も、Excel Application 内では、自動的にプロパティが決定しますから、Value 値になります。しかし、環境によっては(オートメーションオブジェクト内)、セルにプロパティがないと、エラーが発生することがあります。出来る限り、明示的にプロパティは必要です。

また、 If Cells(x,"A").Value = Empty も If Cells(x,"A").Value = "" も、If Cells(x,"A") = 0 も、数値比較なのか、文字比較なのかによって、True/Falseが決まるのであって、それが、厳密に空である判定にはなりません。

Empty 値は、0 と同義ですし、="" は、長さ0の文字列「""」と同義です。長さ0の文字列は、値として存在しています。

あえて、文字列比較で空を判定しようとするなら、
 If Cells(i, 1).Formula = ""
ということになりそうです。

通常は、空のセルは、IsEmpty() で判定します。ワークシート関数で、ISBLANK(セル) の判定と同じです。

セル =Empty とすると、0 でも、空と判定してしまいます。

なお、余談ですが、「長さ0の文字列」と「値0の文字列」の二種類の空文字とがあります。
値0の文字列 は、StrPtr関数で判定します。

VBA では、Null 値は、Variant 型に明示的に代入する値です。その判定は、IsNull を使用します。それによって、Empty値とNull値の違いの判定が可能になります。Empty 値は、上記の説明のように、0 と同義になってしまうので、コードによって判定をも違うことがありますが、Null 値は明確に判定できます。ワークシートのNull値は、また別のエラー値ですから、これらとは別の値です。VBAをお使いになるなら、こういう点の違いは、押さえておいたほうがよいかとは思います。

セル に、="" や0 を入れて判定してみればよいです。

今回の空白セルかどうかの判定は、「'」プレフィックス文字(PrefixChar)で比較してみると、空白かどうかの違いが分かるはずです。
    • good
    • 1

とりあえずForNextで繰り回すのが良いでしょうが、進歩が無い。


エクセルでは、特有の、条件付き書式というのはある(アクセスにもあるが)。この操作を下記に書いておきますので、マクロの記録をとってVBAコードを出して勉強してください。
ーー
A1:G5を範囲指定しておいて
書式ー条件つき書式ー式がー式に
=AND(A1<>"",$A1=$B1)  A1、B1の両方に色をつける場合
=AND(A1<>"",A1=B1)   A1だけに色をつける
を入れる。
ーーー
空白セルの捉え方は
IF Cells(X, "A").Value="" Then
処理スキップ
で良いのでは。Nullなど考えなくても。
    • good
    • 0

こんばんは。


Ano.2の方と同じ考えなのですが…

If Cells(X, "A").Value <> "" And _
  Cells(X, "B").Value <> "" And _
  Cells(X, "A").Value = Cells(X, "B").Value Then

※質問文の例題だと必要な条件式は Cells(X, "B").Value <> ""
 だけでもまあよい。
    • good
    • 0

こんばんは。



まあ、こんな風にすればよいのですが、

If Not IsEmpty(Cells(x, "A").Value) _
  And Not IsEmpty(Cells(x, "B").Value) Then
If Cells(x, "A").Value = Cells(x, "B").Value Then
 Btn = MsgBox("同じ数値です", vbOK, "警告")
 If Btn = vbOK Then
  Cells(x, "A").Interior.ColorIndex = 3
  Cells(x, "B").Interior.ColorIndex = 3
 End If
 End If
End If
Next

ところで、Null 値というのは、ちょっと難しい値で、Variant 型にある、有効でない値の値っていう複雑な意味ですね。では、Empty 値といいたいのですが、そのEmpty 値というのは、ちょっとややこしいので、IsEmpty で取るのが楽だと思うのです。もちろん、ワークシートのセル上に、実質的に、Empty の種類があったとしても、比較する分には問題はないのですが、厳密にいうと、VBAでは違ってくるわけです。
    • good
    • 0

trimを入れて見ました、



Sub ナンバーチェック()
Dim Btn As Integer
For X = 1 To 20
If Cells(X, "A").Value = Cells(X, "B").Value And Trim(Cells(X, "A").Value) <> "" Then

Btn = MsgBox("同じ数値です", vbOK, "警告")
If Btn = vbOK Then
Cells(X, "A").Interior.ColorIndex = 3
Cells(X, "B").Interior.ColorIndex = 3
End If
End If
Next
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます!
Trimって、すごいんですね~!
他の方のやりかたでもできましたが、この数式でもできました。
ありがとうございました!

お礼日時:2007/07/08 13:05

NO.1です


または多重分岐でも良いです。
以下のselect caseを参照してください。

参考URL:http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …
    • good
    • 0

If Cells(X, "A").Value = Cells(X, "B").Value And Cells(X, "A").Value <> "" Then



ではどうですか
    • good
    • 0
この回答へのお礼

すみません、頑張ってみたけどダメでした~★

お礼日時:2007/07/06 21:09

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

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

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。

以下のようなプログラムをVBAで作成したいと考えています。

A1のセルに値があれば、その値をB1に返す。
次にA2のセルに値があれば、その値をB2に返す。
A行に値がある一番下のセルまで同じようなことをさせたいと考えています。

VBAは初心者です。
どなかた宜しくお願い致します。

Aベストアンサー

#2さんと似たものですが・・・・参考にしてください。

Sub test001()
Dim i As Long
i = 1
Do While Cells(i, 1) <> ""
Cells(i, 2) = Cells(i, 1)
i = i + 1
Loop
End Sub

Q:【Excel VBA】 Do Until ~ Loop 構文で途中の空白セルを飛ばしてデータのチェックをしたい

こんにちは。

Do Until ~ Loop 構文で
空白セルまでループして重複する値をチェックしたいと考えています。

---------------------------------------------
Sub 重複チェック()
Dim 検索語 As String
Dim 該当数 As Long
Dim 確認 As Integer
Range("A4").Activate

Do Until ActiveCell.Value = ""

検索語 = ActiveCell.Value
該当数 = WorksheetFunction.CountIf(Range("A:A"), 検索語)

If 該当数 >= 2 Then

ActiveCell.AutoFilter Field:=1, Criteria1:=検索語

確認 = MsgBox("次を検索しますか?", vbYesNo)
If 確認 = vbNo Then Exit Sub

End If

ActiveCell.Offset(1, 0).Activate

Loop

Range("A4").AutoFilter

MsgBox "名前の重複チェックが終了しました。"

End Sub
---------------------------------------------

ただセルA列には行の途中、空白も含まれているため、
途中で止まってしまいます。

今後A列にはデータが追加されていきます。
途中の空白セルを飛ばして、
データーの最後までチェックするにはどのようにすればよいでしょうか?

こんにちは。

Do Until ~ Loop 構文で
空白セルまでループして重複する値をチェックしたいと考えています。

---------------------------------------------
Sub 重複チェック()
Dim 検索語 As String
Dim 該当数 As Long
Dim 確認 As Integer
Range("A4").Activate

Do Until ActiveCell.Value = ""

検索語 = ActiveCell.Value
該当数 = WorksheetFunction.CountIf(Range("A:A"), 検索語)

If 該当数 >= 2 Then

ActiveCell.AutoFilter Fi...続きを読む

Aベストアンサー

> 以降空白4列下のセルで動作が終了するのはどうしてでしょうか?

失礼しました。
開始が4行目のセルだということを失念していました。

Sub 重複チェック()
Dim 検索語 As String
Dim 該当数 As Long
Dim 確認 As Integer
Dim x As Long, n As Long

x = ActiveSheet.Cells(65536, "A").End(xlUp).Row '最終行取得

For n = 4 To x '最終行まで検索
Cells(n, 1).Activate
検索語 = ActiveCell.Value
該当数 = WorksheetFunction.CountIf(Range("A:A"), 検索語)

If 該当数 >= 2 And 検索語 <> "" Then
ActiveCell.AutoFilter Field:=1, Criteria1:=検索語

確認 = MsgBox("次を検索しますか?", vbYesNo)
If 確認 = vbNo Then Exit Sub

End If

Next n
Range("A4").AutoFilter
MsgBox "名前の重複チェックが終了しました。"
End Sub

> 以降空白4列下のセルで動作が終了するのはどうしてでしょうか?

失礼しました。
開始が4行目のセルだということを失念していました。

Sub 重複チェック()
Dim 検索語 As String
Dim 該当数 As Long
Dim 確認 As Integer
Dim x As Long, n As Long

x = ActiveSheet.Cells(65536, "A").End(xlUp).Row '最終行取得

For n = 4 To x '最終行まで検索
Cells(n, 1).Activate
検索語 = ActiveCell.Value
該当数 = WorksheetFunction.CountIf(Range("A:A"), 検索語)

If 該当数 >= 2 And 検索語 <...続きを読む

Q[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ。

VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。
(例)
L列に、A、B、C、D、E、Fとランダムに文字が入っていて、
文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。

Sub Search()
Dim A As String
Set A = Worksheets("Sheet1").Cells.Find("A")
If A Is Nothing Then
ActiveCell.Offset(0, 1).Value = 0

End If
End Sub
と過去の質問で考えてみたのですが、Aがあった時、、、、
とコードが書けないです。
大変困っているので、ご教授頂けないでしょうか?
出来れば、そのままマクロに出来るコードを教えて頂けないでしょうか?
宜しくお願い致します。

Aベストアンサー

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表格が、この「Find」 です。

>Set A = Worksheets("Sheet1").Cells.Find("A")

>過去の質問で考えてみたのです

どうも、Find メソッドは、あるレベル以下の人は、省略する傾向があるようです。何が大事で、何が大事でないかというのは、やってみなければ分かりませんが、検索語だけを入れる書き方は、実務では、あまりしないほうがよいと思います。

だいたい、以下のTestFind2 ぐらいまでに、省略は、とどめたほうがよいです。

それは、Find は、必ずしも自分が思っているデフォルトとは違うことがあるので、「明示的(意図的に)」にオプションは入れたほうがよいです。
例えば、大文字小文字の違いを付けるなら、MatchCase:=True, 数式まで探すなら、LookIn:=xlFormulas

なお、Find メソッドは、5年経っても、たぶん完全に覚えられません。面倒なコードのひとつです。ですが、これはパターンが決まっているので、ひとつパターンが決まったら、それに当てはめればよいだけです。

#3さんで示されているMougのサンプルコードと似てはいるのですが、Mougのサンプルコードでは、Verionによって、失敗することがあります。

'--------------------------------------
'記録マクロをそのまま使う方法
Sub TestFind1()
Dim c As Range
 Set c = Columns("L:L").Find(What:="A", _
           After:=ActiveCell, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           SearchOrder:=xlByRows, _
           SearchDirection:=xlNext, _
           MatchCase:=False, _
           MatchByte:=False, _
           SearchFormat:=False)
 c.Offset(0, 1).Value = 0
End Sub
'--------------------------------------
'TestFind1 をアレンジしてみる
Sub TestFind2()
Dim c As Range
'検索語
Const MYTXT As String = "A"
 Set c = ActiveSheet.Columns("L:L").Find(What:=MYTXT, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           MatchCase:=False)
 If Not c Is Nothing Then
    c.Offset(0, 1).Value = 0
 End If
End Sub

'---------------------------------------
'複数ある場合(パターンを使った方法)
'---------------------------------------
Sub TestFind3()
  Dim c As Range
  Dim FirstAdd As String
  Const MYTXT As String = "A"
  Set c = ActiveSheet.Columns("L:L").Find( _
    What:=MYTXT, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    MatchCase:=False)
  
  If Not c Is Nothing Then
    FirstAdd = c.Address
    Do
      c.Offset(, 1).Value = 0
      Set c = ActiveSheet.Columns("L:L").FindNext(c)
      If c.Address = FirstAdd Then Exit Sub
    Loop Until c Is Nothing
  End If
End Sub

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

Qある範囲のセルから任意の値を検索して、その隣のセルの値を取得するという関数はありますか?

Excelの関数について質問します。
ある範囲のせるを検索して、その隣のセルの値を取得するという関数を探しています。
なければユーザー定義で作りたいと思っています。
VLOOKUP関数では一番左端が検索されますが、
それをある範囲まで拡張して、
その右隣の値を取得できるようにしたいのです。
どうかお知恵をお貸しください。

Aベストアンサー

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場合によっては、IFをかぶせてCOUNTIFで確認した方が良いかもしれません。
 ex. =IF(COUNTIF(A1:F200,X1)=1,【上記数式】,"えらー")

ちなみに、VBAでやるならこんな感じになるかと。

動作の概要
 【検査範囲】から【検査値】を探し、
 最初にHITしたセルについて、右隣のセルの値を返す。
 ex. =Sample(X1,A1:F200)

'--------------------------↓ココカラ↓--------------------------
Function Sample(ByVal 検査値 As Variant,ByVal 検査範囲 As Range)
 For Each セル In 検査範囲
  If セル = 検査値 Then Exit For
 Next セル
 Sample = セル.Offset(0, 1)
End Function
'--------------------------↑ココマデ↑--------------------------

いずれもExcel2003で動作確認済。
以上ご参考まで。

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場...続きを読む

Q数式による空白を無視して最終行を取得するマクロ

A1~D8まで数式が入っていて、if関数によって条件に合わない場合は、空白にしています。
条件に合わない場合は行すべてが空白になり、1つのセルだけが空白になることはありません。
(画像参考)

A1~D3までは数式によって数値や文字列が表示されています(A列・B列は文字列です)
A4~D8まではif関数による空白(””)の状態です。

この状態で、最終行の次のセルをアクティブにするマクロ
Cells(Rows.Count, 1).End(xlUp).Offset(1).Select
を実行すると、A9が選択されます。

これを、A4を選択するマクロを教えていただけないでしょうか。

説明が分かり難かったらすみません。

よろしくお願いします。

Aベストアンサー

No.1です。
たびたびごめんなさい。

もう少し短くできました。

Sub Sample2()
Dim i As Long
On Error Resume Next '//←念のため
For i = Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1
If Cells(i, "A") <> "" Then Exit For
Next i
Cells(i, "A").Offset(1).Select
End Sub

にしてみてください。m(_ _)m

Qエクセルで、条件に一致した行を別のセルに抜き出す方法

エクセルで、指定した条件に一致するセルを含む行をすべて抜き出す方法が知りたいです。

たとえば、

<A列> <B列> <C列>
7/1 りんご 100円
7/2 ぶどう 200円
7/2 すいか 300円
7/3 みかん 100円

このような表があって、100円を含む行をそのままの形で、
別のセル(同じシート内)に抜き出したいのですが。

7/1 りんご 100円
7/3 みかん 100円

抽出するだけならオートフィルターでもできますが、
抽出結果を自動的に、別の場所に、常に表示させておきたいのです。

初歩的な質問だと思いますが、検索しても分からなかったので、よろしくお願いします。

Aベストアンサー

同じ質問が結構よく出てますが、そんなに初歩的でもありません
別シートのA1セルに「100円」と入力し、そのシートの任意のセルに以下の式を貼り付けて下さい。後は、下方向、右方向にコピー。
日付のセル書式は「日付」形式に再設定してください

=IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(A1),INDEX(Sheet1!A:A,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(A1)+1)),"")

データ範囲は500行までとしていますが、必要に応じて変更して下さい


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

人気Q&Aランキング