ここから本文です

VBSの質問です。 Excelで表が5000行ほどあります。列は25列です。 A列には五文...

tra********さん

2017/11/2108:00:48

VBSの質問です。

Excelで表が5000行ほどあります。列は25列です。
A列には五文字の全角英字が入力されています。
VBSを起動した時に、A列の全角英字をキーにして、その五文字の全角英字が入っている1行を参照する方法は

ないでしょうか?
VBAではなく、VBSで行いたいと思っています。
よろしくお願いします。。。

補足セルの取得ではなく行取得の方法が分かりません。。。

閲覧数:
48
回答数:
3

違反報告

ベストアンサーに選ばれた回答

Prometheusさん

2017/11/2112:50:10

こういうことでしょうか?

このプログラムは、「~.xlsx」ファイルを、1つだけドラッグ&ドロップしてください。

なお、今、サンプルで作ったエクセルファイルは、邪魔くさかったので、3文字の全角英字で試しました。

そして「Find」によって、今回は、実際に存在するのを確認した「IEQ」を検索し、見つけると、その「行」が何行目かを表示しています。

Option Explicit
Dim bk, ex, f, sh, so, wa
Set so = CreateObject("Scripting.FileSystemObject")
Set wa = WScript.Arguments
If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "xlsx" Then
MsgBox("ドラッグ&ドロップできるのは、xlsxファイル1つだけです")
WScript.Quit
End If
Set ex = CreateObject("Excel.Application")
ex.Application.DisplayAlerts = False
ex.Visible = False
Set bk = ex.Workbooks.Open(wa(0))
Set sh = bk.ActiveSheet
Set f = sh.Cells.Find("IEQ")
If Not (f is Nothing) = True Then
MsgBox(f.Row)
End If
bk.Close
ex.Quit
Set f = Nothing
Set sh = Nothing
Set bk = Nothing
Set ex = Nothing
Set wa = Nothing
Set so = Nothing

簡単な説明です。

Option Explicit

このオプションを設定すると、変数は、その使用の前に、必ず「Dim」等によって宣言しておかなければなりません。

Set so = CreateObject("Scripting.FileSystemObject")

ファイルやフォルダを扱えるようにしています。

Set wa = WScript.Arguments
If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "xlsx" Then
MsgBox("ドラッグ&ドロップできるのは、xlsxファイル1つだけです")
WScript.Quit
End If

ドラッグ&ドロップされるのを待っていて、ドラッグ&ドロップされると、その数と拡張子を調べ、想定外なら、メッセージを表示して、プログラムそのものを終了しています。

Set ex = CreateObject("Excel.Application")

エクセルを扱えるようにしています。

ex.Application.DisplayAlerts = False
ex.Visible = False

「上書きしますか?」などと聞いてこないようにし、エクセルを表示しません。

Set bk = ex.Workbooks.Open(wa(0))
Set sh = bk.ActiveSheet

ドラッグ&ドロップされたファイルを開き、アクティブシートを「sh」にセット。

Set f = sh.Cells.Find("IEQ")

今は、アクティブシートのすべてのセルから「IEQ」を検索していますが、範囲を指定するのでしたら、

r = sh.Cells(sh.Rows.Count, 1).End(-4162).Row
Set f = sh.Range("A1:Y" & r).Find("IEQ",,,1)

と、記述してください。

「-4162」は「xlUp」です。

「xlUp」のように「xl」のついたものは、エクセル特有のもので、他の「VBA」などでは使えません。

しかし、実際には「xlUp」などは、単に「数値」で、それを人間に分かりやすいように「xlUp」などと表記しているだけなので、その「数値」を使います。

同じく、「完全一致」を意味する「xlWhole」もその値は「1」ですので、「,,,1」で、「完全一致」になります。

また、このように「Set~」で使う変数は、「オブジェクト」です。

「オブジェクト」は、「情報」だと考えると分かりやすいと思います。

見つかったセルのすべての「情報」が「f」に入るのです。

そこで、そのセルの「値」を知りたければ、「f.Value」となりますし、そのセルの「列」が知りたければ、「f.Column」となります。

もちろん、その「行」が知りたければ、「f.Row」で、分かるわけです。

If Not (f is Nothing) = True Then

本来は、「()」も「True」も不要ですが、私はこの方が「美しい」と思うので付けています。

If Not f is Nothing Then

と、記述しても同じです。

もちろん意味は、「存在しなかったら」の「Not」ですから、「見つかったら」です。

MsgBox(f.Row)

その見つかったセルが、何行目にあるかを表示しています。

bk.Close
ex.Quit

ブックを閉じ、エクセルそのものを終了しています。

Set f = Nothing
Set sh = Nothing
Set bk = Nothing
Set ex = Nothing
Set wa = Nothing
Set so = Nothing

「Set ~」で使った変数は、「Nothing」で解放しておきます。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

hdu********さん

2017/11/2109:57:15

hon********さん

2017/11/2109:56:23

セルの取得ができるのに行取得の方法が分からないの
意味が分からない???

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる