[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『rangeで数値を取得』(hyurie)
rangeで数値を取得することはできますか?
databook1 A2~
databook2 A6~
databook1のA列には項番が入っています。
databook2のA列に項番を入れるとdatabook1のA列にある項番と同じ行のデータを抽出するというvbaを書きたいと思っています。
このコードの途中に下記のようなコードがあります。
Dim f As Range
With ThisWorkbook.Sheets("管理") 'databook2
For Each c In .Range("A6", .Range("A" & .Rows.Count).End(xlUp))
Set sh = Workbooks(HPFName).Sheets(1) 'databook1
Set f = sh.Range("A1", sh.Range("A" & sh.Rows.Count).End(xlUp)).Find(What:=c.Value, LookAt:=xlWhole)
If Not f Is Nothing Then
管理シートはdataboo1にあります。HPFNameはdatabook1です。
A列には数値しか入っていません。文字列を入れて動かすと最後まで通るのですが、数値だけで動かすと、f=Nothingとなり、抽出してくれません。
このような場合はどう書き換えたら良いのでしょうか?教えてください。
< 使用 Excel:Excel2012(Mac)、使用 OS:Windows7 >
こんにちは
問題無さそうな気がしますけど、Macだと違うんでしょうかね?
「管理シートはdataboo1にあります」
といいつつ
「With ThisWorkbook.Sheets("管理") 'databook2 」
なってたりするのは気になりますけど。
要件自体はVlookUpでも良さそうですけどダメなんでしょうか?
(ウッシ) 2015/09/02(水) 10:36
どちらのブックの A列にも 「数値」ということですね。
で、そちらでは、databook2側の入力を文字列にすると('123456 等) マッチするけど、数値の 123456 だと
対象があってもマッチしないということですか?
Mac は持っていないので検証できないのですが、Win7+xl2010、Win8.1+xl2013 では
数値 Vs 数値 でも、もちろんマッチしますし、数値 VS あえて文字列にした数字 でもマッチします。
Macは違うんですかね?
ところで、列が決まっているわけですから、ウッシさんがいわれるように VLOOKUP がいいと思いますし
項目を複数個抽出したいなら、都度 VLOOKUP は重くなるので MATCH で行を取得して項目を取り出すといったことがいいかも。
(β) 2015/09/02(水) 10:42
プロフラムって、ある入力データでは、作動しても 入力データが違うと作動しない なんてことは、
よくあることです。この場合、どのようなデータの場合、作動しないのか を特定することが先決なのですが、
そのデータ例が記述されていませんよね?
入力データ例 と正常時の出力データと現在の入力データに対する誤動作出力データ結果などの
データを記述してください。
新規ブックの標準モジュールに以下のコードをコピーし、実行してみてください。
Option Explicit
Sub test2()
Dim rng As Range
With Range("a1:a10")
.ClearContents
.NumberFormatLocal = "000000"
.Formula = "=row()"
.Value = .Value
MsgBox "ご覧のデータをセルA10で検索してみます"
Set rng = .Find(what:=.Cells(10).Value, LookIn:=xlValues, lookat:=xlWhole)
MsgBox "rng is nothing = " & (rng Is Nothing) & vbCrLf & _
IIf(rng Is Nothing, "つまり、存在するセルの値が検索範囲で見つかりません", "ちゃんと見つかった")
End With
End Sub
FindメソッドのLookInかWhatどちらかを変更すれば 作動しますけど、これと同じような内容なら、
検討してみてください
(ichinose) 2015/09/03(木) 07:52
あぁ、表示形式のアンマッチでしたかね! そこに思いが至りませんでした。
すでに ichinoseさんからコメントがでていますので、蛇足になりますが。
検索や置換は、特に指定しなければ、多くのパラメータを、その直前にエクセル区画で実行された検索や置換(操作であろうがマクロ処理であろうが)の「オプション」から継承します。
特に、LookAt は重要ですが、関連のセルが表示形式で異なる表示になっていた場合、LookIn も【キモ】になります。
LookIn は xlValuses ないしは xlFormulas です。
で、他のメソッドでは xlValues って、「セルの値そのもの」として扱われることが多いのですが、
Find の場合は、「セルの表示文字列 つまり Text」が参照されます。値で比較したい場合は xlFormulas を使います。
(ほかのメソッドと違うので、ちょっとまぎらわしいところですね)
以下、もう1つ、確認サンプルを。
Sub Test3()
Dim f As Range
Columns("A").Clear
Columns("A").NumberFormatLocal = "yyyy年m月"
Range("A10").Value = Date
Range("B1").NumberFormatLocal = "G/標準"
Range("B1").Value = Date
Set f = Columns("A").Find(What:=Range("B1").Value, LookAt:=xlWhole, LookIn:=xlValues)
If f Is Nothing Then
MsgBox "Values ではマッチしません。Formulas で再試行します"
Set f = Columns("A").Find(What:=Range("B1").Value, LookAt:=xlWhole, LookIn:=xlFormulas)
End If
If f Is Nothing Then
MsgBox "Values でも Formulas でも見つかりません"
Else
MsgBox f.Address & " に見つかりました"
End If
End Sub
(β) 2015/09/03(木) 08:55
返信が遅くなり申し訳ありません。
管理シートはdatabook2にあります。混乱させてしまい申し訳ありません。
わかりにくいので、databook2のA列にあった数値をB列に移動しました。
数値"だけ"以外なら全て抽出できています。
"15/09/08"や"〒100-0000"など文字列や記号が含まれていれば抽出できます。
"1110"などの数値だけのセルは抽出できません。
With ThisWorkbook.Sheets("管理") 'databook2
For Each c In .Range("B6", .Range("B" & .Rows.Count).End(xlUp))
Workbooks("databook1.xlsx").Sheets(1).Activate
Set sh = Workbooks("databook1.xlsx").Sheets(1)
Set f = sh.Range("A1", sh.Range("A" & sh.Rows.Count).End(xlUp)).Find(What:=c.Value, LookAt:=xlWhole)
If Not f Is Nothing Then Exit For
Next
If Not f Is Nothing Then
With f.EntireRow
c.Offset(, 3).Value = .Range("D1").Value
c.Offset(, 4).Value = .Range("E1").Value
End With
End If
End With
End Sub
(hyurie) 2015/09/08(火) 10:42
databook1の方はブック全体にロックがかかっていたため編集が不可能だったのですが、
編集できるようにロックを解除してもらい確かめてみたところ、
A列の数値は連番になっていて、関数が入っていました。だから取得できなかったのでしょうか?どうすれば取得できるようになるのでしょうか?どうか宜しくお願いします。
(hyurie) 2015/09/08(火) 10:48
回答がついているのに消されていたものを復活。
>>どうすれば取得できるようになるのでしょうか?
ichinoseさんから 検索先と検索元の「表示形式」を同じにして Values検索する方法のアドバイスがありました。 また、βから、検索元、検索先の表示形式には関係なく Formulas 検索をする案をアップしました。
これらは、試してみられましたか?
(β) 2015/09/08(火) 17:19
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.