中小企業の働き方改革をサポート>>

■困っていること
vbaの worksheetfunction のmatach関数を用いているが、日付が見つかってくれない。
なぜ見つからないか、原因を教えていただけないでしょうか?よろしくお願いします。

■状況、やりたいこと
下記、コードで、「fRow」と「syu」までは正しく求められるのですが、「tcol」を求めようとすると、どうしても0になってしまいます。
ワークシートはD1セルに日付を入力おり、さらに右のセルへ行く毎に+7しています。「syu」の日付がどの週に該当するのかを、列数で求めたいです。
例えば、10年3月17日なら、Fの列なので 6 を求められるようにしたいです。

sub test()
Dim fRow As Long
Dim tcol As Long
Dim syu As long

With Worksheets("data")

Set fRange = Sheets("data").Columns(1).Find(What:=TextBox1.Value, _
LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)

If (fRange Is Nothing) Then
Exit Sub
End If

fRow = fRange.Row

  syu = .Cells(fRow, 2).Value

tcol = Application.WorksheetFunction.Match(syu, .Range("1:1"), 1)
msgbox tcol
  end with

end sub

「excel match で日付が見つから」の質問画像

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

VBA 基礎」に関するQ&A: VBAの基礎

A 回答 (5件)

TextBox1.Value の属性が、日付でなく文字列になってしまっているからだと思われます。


検索対象が、日付なのであれば、VBAのDateValue関数で
What:=DateValue(TextBox1.Value)
とすればいいかと。

セル内の日付は、表示はどうあれ1900年1月1日を1とするシリアル値です。

テキストボックスの入力形式を、DateValue関数が日付と認識できないようであれば、年月日を区切り、Year, Month, Day関数でYear(入力した年) + Month(入力した月) + Day(入力した日) で日付属性のシリアル値になります。

ワークシート上の検索対象の日付の属性を文字列にするのは、弊害の可能性を考慮しておすすめしません。

お試しくださいませ。

参考URL:http://www.d3.dion.ne.jp/~jkondou/excelvba/date. …
    • good
    • 1
この回答へのお礼

解答ありがとうございました。

日付の検索は、関数だと楽なのに、vbaだととても苦労します。

勉強になりました。ありがとうございました。

お礼日時:2011/11/22 22:53

>TextBox1.Valueを使っているが、テキストボックスは、ワークシート上に貼り付けているのか、フォーム上に貼り付けているのか、質問に書くべきだ。

コードを変えるべき場合が在る。経験して無いか。
またテキストボックスのTEXTは文字通りテキストで、エクセルの日付セルに普通設定される日付シリアル値では無いだろう。この点エクセルの基本。普通のエクセルのことを不十分な勉強で、VBAに取りかかっていないか。
DateValue関数などでの変換をやらずに検索しているのはなぜ。
基礎的なことだ。
ーー
Sheet1でA列A1:A20などに
2011/11/1
2011/11/2
2011/11/3
2011/11/4
2011/11/5
2011/11/6
2011/11/7
2011/11/8
2011/11/9
・・・
ト入れて
Sub test()
Dim fRow As Long
Dim tcol As Long
Dim syu As Long

With Worksheets("Sheet1")
dt = DateValue(Worksheets("Sheet1").TextBox1.Value)
MsgBox dt
Set fRange = Sheets("Sheet1").Columns(1).Find(What:=dt, _
LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)

If (fRange Is Nothing) Then
Exit Sub
End If

fRow = fRange.Row
MsgBox fRow
syu = .Cells(fRow, 2).Value

tcol = Application.WorksheetFunction.Match(syu, .Range("1:1"), 1)
MsgBox tcol
End With

End Sub
を実行すると5行目がMsgBox fRowのところで返ったよ。
それ以後行は不知。
ーー
要点は
(1)DateValue関数  基礎的なこと
(2)Worksheets("Sheet1").TextBox1.ValueのWorksheets("Sheet1").が必要なのは、経験
から原因では無いか。質問する前にMsgbox を要所に入れて確認してみれば、何処でおかしいかすぐ判る。正式にはデバッグの方法を使うこと。
(3)それに質問には、簡単にするため、修正したり、略したのかもしれないが、テキストボックスの値を変えて、やるようなものなら、コマンドボタンのクリックイベントなどを、実行のきっかけにしないと使いづらいのでは。
(4)前半はFind、後半はMatchを使っている不統一はなぜ。
>tcol = Application.WorksheetFunction.Match(syu, .Range("1:1"), 1)
は何をしたかったのかデータ例を挙げて文章で説明すべきだ。
コードを書けばそれぐらい判ってくれる、というのは質問者の甘え。コードが絶対的じゃないから、ここに質問するはず。
シートのデータ例(と目的)は必ず質問異挙げよ。
    • good
    • 0
この回答へのお礼

解答ありがとうございました。

おかげさまで、datavalue関数を、しっかりと覚えることができました。

お礼日時:2011/11/22 23:00

No2.です。

もう一箇所ありました。

検索範囲指定がColumns(1)ではなく、Rows(1)では?
できれば、Rangeで指定された方がいいようにも思います。

SearchOrder:=xlByRowsも若干気になります。いらないといえばいらないし、xlByColumnsでは?

参考URLもご参照くださいませ。

参考URL:http://officetanaka.net/excel/vba/cell/cell11.htm
    • good
    • 0
この回答へのお礼

解答ありがとうございました。

頂いたご指摘内容を元に、じっくりと見直します。

勉強になりました。ありがとうございました。

お礼日時:2011/11/22 22:55

B列は作業名称になっており、日付ではないですね。

作業の内容は関数でも対応できる内容ですね。マクロを考える前に関数で行うとしたらどうなるかを考えることが必要でしょう。
    • good
    • 0
この回答へのお礼

解答ありがとうございました。

お礼日時:2011/11/22 22:54

>「tcol」を求めようとすると、どうしても0になってしまいます。


 ⇒添付図がdataシートならばFind関数でヒットしたB列に日付が設定されていると
  思えないのでシートのデータ構成を見直してみたら如何でしょうか。
    • good
    • 0
この回答へのお礼

解答ありがとうございました。

お礼日時:2011/11/22 22:52

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

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

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

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

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

Qエクセルmatch関数を使った日付の検索

株価の表があり、項目は日付、初値、高値、安値、終値、出来高のA列からF列になっています。
もう一つデータの入ってない表があり、そちらにデータの入っている元の表から日付で検索して合致
するデータを持ってきたいのです。(呼び出し側の表の最後のデータから、日付を取り出して検索しています)
項目日付の書式は日付型になっています。
自分なりに調べて次のようにしました。

Sub sinkabuka()
Dim ken As Variant
Dim motorow As Integer
Dim sinrow As Integer
Dim han As Object
Dim a As Variant

motorow = Worksheets(2).Range("a65536").End(xlUp).row
sinrow = Worksheets(1).Range("a65536").End(xlUp).row
If sinrow = 1 Then
Exit Sub
End If
ken = Worksheets(1).Range("a" & sinrow).Value2
Worksheets(2).Activate
Worksheets(2).Select
Set han = Range("a2:f" & motorow)
a = Application.WorksheetFunction.Match(ken, han, 0) <ーエラーになります

match関数でアドレスをとれるようになったら、合致したデータの次のデータをとるようにしたいと
おもっています。
試しにvlookup関数を使ったらデータを返してくれました。
excel2010 windows7です。
アドバイスをお願いします。 

株価の表があり、項目は日付、初値、高値、安値、終値、出来高のA列からF列になっています。
もう一つデータの入ってない表があり、そちらにデータの入っている元の表から日付で検索して合致
するデータを持ってきたいのです。(呼び出し側の表の最後のデータから、日付を取り出して検索しています)
項目日付の書式は日付型になっています。
自分なりに調べて次のようにしました。

Sub sinkabuka()
Dim ken As Variant
Dim motorow As Integer
Dim sinrow As Integer
Dim han As Object
Dim...続きを読む

Aベストアンサー

VLOOKUPとMATCH関数では少し相違します。
MATCHの範囲は単一列、行としないと検索できませんので範囲を変更して下さい。
私見ですが、FINDメソッドの方が簡単と思いますが如何でしょうか。

QVBAでのMATCH関数の使用

現在,VBAにてシートの比較プログラムを行っておりますが,その中で検索範囲を示すRangeに名前を使用したいのですがエラーでうまくいきません。

エラーは
「実行時エラー:1004
WorksheetFunctionクラスのMatchプロパティが取得できません」
とでます。

記述は

Application.WorksheetFunction.Match(Cells(r, 132), Range("リース型具Key1"), 0)

としており,”リース型具Key1”が事前に名前登録してある名前です。

方法をご存知の方,よろしくお願いします。

Aベストアンサー

シートが異なるとは思ってもいませんでした。

例えば、Cells(r, 132) が Sheet2 にあれば、下記のようにすればいいはずです。
シートを指定していなければ、マクロを実行したシートのCells(r, 132)になっているはずです。

Application.WorksheetFunction.Match(Worksheets("Sheet2").Cells(r, 132), Range("リース型具Key1"), 0)


それから、Match関数で結果が求まる場合は問題ありませんが、結果が求まらない場合の処理も考慮すべきでしょう。下記は参考例です。

Sub myTest01()
  Dim shtNo As Integer
    shtNo = 2
  Dim ws2 As Worksheet
  Dim ws3 As Worksheet
    Set ws2 = Worksheets("Sheet" & shtNo)
    Set ws3 = Worksheets("Sheet3")

  On Error GoTo ErrorTrap
  
  MsgBox Application.WorksheetFunction.Match(ws2.Cells(2, 2), _
                       ws3.Range("リース型具Key1"), 0)
  '
  '// 色々な処理 //
  '
  Set ws2 = Nothing
  Set ws3 = Nothing

  Exit Sub

ErrorTrap:
  MsgBox ws2.Cells(2, 2) & "は見つかりません。"
  Resume Next
End Sub

シートが異なるとは思ってもいませんでした。

例えば、Cells(r, 132) が Sheet2 にあれば、下記のようにすればいいはずです。
シートを指定していなければ、マクロを実行したシートのCells(r, 132)になっているはずです。

Application.WorksheetFunction.Match(Worksheets("Sheet2").Cells(r, 132), Range("リース型具Key1"), 0)


それから、Match関数で結果が求まる場合は問題ありませんが、結果が求まらない場合の処理も考慮すべきでしょう。下記は参考例です。

Sub myTest01()
  Dim shtNo As...続きを読む

QExcel VBAでの日付検索について

Excel VBAでの日付検索について

Excelに下記のように1時間おきの日時(A列)と値(B列)が数か月分入力されています。
UserFormで入力された月の、日別の合計した値を別ブックに出力したいと思っています。
A列の日時は、セルの書式設定でユーザ定義の「yyyy/m/d hh:mm」となっています。

例)UserFormで8月と入力されたら、8/1の0:00~23:00の値(B列)を合計し、別ブックへ出力し、それを月末(8/31)分まで繰り返し計算し出力したい。


A            B
2010/8/1 0:00       345.5
2010/8/1 1:00       309.4
2010/8/1 2:00       364.2
:       :
:       :
:       :
2010/8/1 23:00       359.0
2010/8/2 0:00       339.9
2010/8/2 1:00       357.3



現在、下記のようなVBAにして、UserFormで入力された月の1日のデータが入力されている行番号を取得
しようとしているのですが、うまく検索されません。
どなたかご教授下さい。


Dim Obj As Object
Dim HitRow As Long
Dim Cerday As Long
Dim myDay As Date

myDay=txt_年.Value & "/" & txt_月.Value & "/1"

Cerday=DateValue(myDate)

Set Obj=Worksheets("sheet1").Cells.Find(Cerday,LookAt:=xlwhole)
If Obj Is Nothing Then
MsgBox "見つかりません。"
Else
HitRow=Worksheets("sheet1").Cells.Find(Cerday,LookAt:=xlwhole).Row
End If

Excel VBAでの日付検索について

Excelに下記のように1時間おきの日時(A列)と値(B列)が数か月分入力されています。
UserFormで入力された月の、日別の合計した値を別ブックに出力したいと思っています。
A列の日時は、セルの書式設定でユーザ定義の「yyyy/m/d hh:mm」となっています。

例)UserFormで8月と入力されたら、8/1の0:00~23:00の値(B列)を合計し、別ブックへ出力し、それを月末(8/31)分まで繰り返し計算し出力したい。


A            B
2010/8/1 0:00       ...続きを読む

Aベストアンサー

時間も同一セルにあるのを見落としてました

Dim myDay As String

myDay = txt_年.Value & "/" & txt_月.Value & "/1*"

Set Obj = Worksheets("sheet1").Cells.Find(myDay, LookAt:=xlWhole)


にしてください。

あとループして全て探し出さないとダメなんじゃないでしょうか

With Worksheets("sheet1").Range("a:a")
Set Obj = .Find(myDay, LookIn:=xlValues)
If Not Obj Is Nothing Then
firstAddress = Obj.Address
Do
Debug.Print Obj.Row
Set Obj = .FindNext(c)
Loop While Not Obj Is Nothing And Obj.Address <> firstAddress
End If
End With

時間も同一セルにあるのを見落としてました

Dim myDay As String

myDay = txt_年.Value & "/" & txt_月.Value & "/1*"

Set Obj = Worksheets("sheet1").Cells.Find(myDay, LookAt:=xlWhole)


にしてください。

あとループして全て探し出さないとダメなんじゃないでしょうか

With Worksheets("sheet1").Range("a:a")
Set Obj = .Find(myDay, LookIn:=xlValues)
If Not Obj Is Nothing Then
firstAddress = Obj.Address
Do
Debug.Print Obj.Row
Set Obj = .F...続きを読む

QExcel MATCH関数で検索範囲内に同じ値の検索値が複数ある場合

MATCH関数で、検索した値が複数ある場合に1つしか出なくて困っています。
(例)
   A B C D
1 年月日 種類 番号 備考
2 4月1日 肉類 1
3 4月2日 野菜 2
4 4月3日 肉類 1
5 4月4日 果物 2
6 4月5日 野菜 1
7 4月6日 果物 3
8 4月7日 果物 2
9 4月8日 肉類 1

この表で、D9の備考の欄に「種類:肉類、番号:1」と同じものがあった時の日付を、新しい日付で取り出したいのです。

INDEX(A2:A8,(MATCH(B9,B2:B8,0)+MATCH(C9,C2:C8,0))/2)
としたのですが、本当は4月3日を取り出したいのですが、4月1日が出てきます。
どのようにしたら良いでしょうか?
Excel2003です。
よろしくお願いします。

Aベストアンサー

MATCH関数を使用しませんが、D9の書式を日付にして、
=MAX((A2:A8)*(C2:C8=1)*(B2:B8="肉類"))
と、入力してShift+Ctrl+Enterキーで入力完了してみてください(配列式になります)。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Qmatchプロパティを取得できません…と出ます。

いつもお世話になっております。
エクセルVBA初心者なので、分かりやすく教えていただきたいのですが、今下記のようなコードを書いています。

Public Function FindData(key As String, ByRef st As Long, ByRef ed As Long) As Long
On Error GoTo FindData_Error
Dim z As Long
Sheets("T_保存").Select
If Range("A2").Value = "" Then
z = 1
Else
z = Range("A1").End(xlDown).Row
End If
st = Application.WorksheetFunction.Match(key, Range("A1:A" & z), 0)
ed = Application.WorksheetFunction.Match(key, Range("A1:A" & z), 1)
FindData_exit:
FindData = 0
Exit Function
FindData_Error:
FindData = -1
End Function
keyは年度で、入力シートからT_保存シートに値でコピーするVBAを組んでいます。
シート上でのMATCH関数では認識しますが、st = ~のところで、「MATCHプロパティを取得できません」と出てしまい、検索結果は「該当なし」なってしまいます。いろいろと調べても見たんですが、どうしても原因が分かりません。
なるべく詳しく教えていただければ・・・と思います。
(初心者のため、ここを伝えなければ、回答できないという項目があれば追加で記入させていただきます。key,zには正常な値が入っています)
よろしくお願いいたします。

いつもお世話になっております。
エクセルVBA初心者なので、分かりやすく教えていただきたいのですが、今下記のようなコードを書いています。

Public Function FindData(key As String, ByRef st As Long, ByRef ed As Long) As Long
On Error GoTo FindData_Error
Dim z As Long
Sheets("T_保存").Select
If Range("A2").Value = "" Then
z = 1
Else
z = Range("A1").End(xlDown).Row
End If
st = Application.WorksheetFunction.Match(key, Range("A1:A" ...続きを読む

Aベストアンサー

とりあえず、「keyは年度で」と言っていますが、モジュール中ではkeyを文字列で宣言していますので、
Application.WorksheetFunction.Match(val(key), Range・・・
と、検索値をval(key)で数値に変換して呼び出してみては?

これでだめなら、st=(またはed=の行)にブレークポイントを設定して、その時のzとkeyの値を調べて、本当にその範囲に値があるか、そのセルの形式(書式->セル->表示形式)が文字列になっているか確認してください。

それでもダメなら、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エクセルで特定の列にある日付データの中から、指定した日付範囲を抽出する方法を教えてください

例えばこんなデータなのですが、

2002/07/01 99 25 36
2002/07/05 55 33 25
2002/08/01 80 20 51

日付の入っている列を検索して、2002/07/01から2002/07/31
の範囲ならば、その行のデータを別のシートに抽出したいのですが、
日付の範囲は関数でどうすればよいのか分かりません。ACCESSなら
between 9999/99/99 and 9999/99/99って感じで簡単にできるの
ですが。。。エクセルの関数だとIF関数の論理式にAND関数を使って
>=2002/07/01
<=2002/07/31
と入力したので、2002/07/05ならば、いずれもTRUEなので、値を返して
くれると考えたのですが、なぜかダメでした。
(↓こういう入力をしました)
=IF(AND(Sheet2!A1>=2002/7/1,Sheet2!A1<=2002/7/31),Sheet2!A1,"該当月ありません")

Aベストアンサー

こんばんは!

=IF(AND(Sheet2!A1>=2002/7/1,Sheet2!A1<=2002/7/31),Sheet2!A1,"該当月ありません")

おしいですね(^^;
日付をそのまま入力してしまうと数式上では
 2002/7/31 → 2002÷7÷31 になってしまいます。
ダブルクォーテーションで括って(文字列)入力して
それを数値化しましょう!

=IF(AND(Sheet2!A1>="2002/7/1"*1,Sheet2!A1<="2002/7/31"*1),Sheet2!A1,"該当月ありません")

文字列 ="10" に対して 乗算 *1 としても数式が
なり立ち文字列の数字が数値化されます。="10"*1

------------余談--------------------------
ご質問の条件例の場合特例で 2002/7でればOKなので

=IF(TEXT(Sheet2!A1,"yyyym")="20027",Sheet2!A1,"該当月ありません")

でも可能ですね!

こんばんは!

=IF(AND(Sheet2!A1>=2002/7/1,Sheet2!A1<=2002/7/31),Sheet2!A1,"該当月ありません")

おしいですね(^^;
日付をそのまま入力してしまうと数式上では
 2002/7/31 → 2002÷7÷31 になってしまいます。
ダブルクォーテーションで括って(文字列)入力して
それを数値化しましょう!

=IF(AND(Sheet2!A1>="2002/7/1"*1,Sheet2!A1<="2002/7/31"*1),Sheet2!A1,"該当月ありません")

文字列 ="10" に対して 乗算 *1 としても数式が
なり立ち文字列の数字が数値化されます。="10"*1

--...続きを読む

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

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

Aベストアンサー

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

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

QApplication.Matchで特定行の検索

Excel2007のVBAについてご教授ください。

Application.Matchで特定列の文字列検索を使いたいんですが以下のような構文で使えますでしょうか?

-----------------
Set usWS = Worksheets("Sheet1")
KeyIdValue = "hogehoge"
JANCol = 9
m = Application.Match(KeyIdValue, usWS.Columns(JANCol), 0)
-----------------

Sheet1のワークシートの9(I列)列目に"hogehoge"が入っている行数をmに入れたいです。
(最初に見つかった行数で構いません。複数は見つかりません。)
検索されません?というようなエラー(エラー2042)が出るのですが、使い方が誤っていないかご教授させて頂きたいです。
変数の宣言はコンパイルエラーが出ないので問題ありません。
Application.Matchの使い方に問題ないか教えて頂けませんでしょうか?

よろしくお願いします。

Aベストアンサー

No.1・2です。

>実コードは
>KeyIdValue = jpWS.Cells(jpWsRow, JANCol).Value
>m = Application.Match(KeyIdValue, usWS.Columns(JANCol), 0)
>という感じでセルを参照しています。。。

文字列ではうまくいって、数値でエラーになるというコトですね?
変数 KeyIdValue の型は何で宣言しているのか不明ですので、いっそのこと
変数に代入せず、MATCH関数の中に直接セルを入れてみてはどうでしょうか?

仮に参照セルが B3セルだとすると

>m = Application.Match(Range("B3"), usWS.Columns(JANCol), 0)

のような感じで・・・
他の変数の型も念のため確認した方が良いと思います。

部分的なコードだけでの回答ですので、これでもダメならごめんなさいね。m(_ _)m


人気Q&Aランキング

おすすめ情報