「夫を成功」へ導く妻の秘訣 座談会

VBSでテキストファイルを1行ずつ読み、ある桁からある項目A(20桁)が始まるとします。
項目Aは漢字が入ります。後ろ空白(1バイト空白)詰めです。
その項目Aの桁数を調べるにはどのようにVBSを組めばよいのでしょうか?

VBSでMid関数とかLen関数を使ってもうまく計算してくれてないような感じなのです。
例えば
桁 →123456789012345678901234567890
data1→aaaaaaaaaこんばんわ
data2→aaaaaaaaaおつかれ

strRec1 = Mid(strRecord,10,20) 
とした場合、stRec1には項目Aが入る予定

data1なら5、data2なら4と返ってきてほしいのです。
ちなみにMidBでもそれぞれ10,8で返ってきてもいいです。

言い換えると、桁n~桁mまでの項目に何桁の漢字があるかを調べたいです。

よろしくお願いします。

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

VB 文字列」に関するQ&A: VB6 文字列間 入力

A 回答 (3件)

SJIS(ASCII)としてカウント(半角1バイト、全角2バイト)で


文字列を取りたいということでしょうか?

上記の例でいくと、「data1→aaaaaaaaaこんばんわ 」の長さは
20というバイト数(桁数ではありません)が帰ってくれば
OKということですよね?(Lenだと15が帰ってくるから)

もし、そうであれば、下記のようなバイト数を取得する
コードを組まなければなりません。
(半角=1バイト、全角=2バイト)

理由:Lenは桁数を読み込んでしまうので、バイトはカウントしません。また、LenBという関数があるんですが、UNICODEでの計算になるので、1文字=2バイトになってしまいます。

■Lenの場合
dim data1
data1 = "aaaaaaaaaこんばんわ"
msgbox CountLen(data1)
function CountLen(byval data)
  dim i
  dim c
  dim counter
  counter = 0
  for i = 1 To Len(data)
    c = asc(mid(data, i, 1))
    if c >= &H00 and c <= &H7E then
      counter = counter + 1
    else
      counter = counter + 2
    end if
  next
  CountLen = counter
end function

■Midの場合

dim data2
data2 = "aaaaaaaaaおつかれ"
msgbox OriginalMid(data2, 9, 3)

function OriginalMid(byval data, byval startIndex, byval length)
  dim i
  dim c
  dim counter
  dim returnValue
  counter = 0
  returnValue = ""
  for i = 1 To Len(data)
    c = asc(mid(data, i, 1))
    if c >= &H00 and c <= &H7E then
      counter = counter + 1
    else
      counter = counter + 2
    end if
    if (counter >= startIndex) and (counter <= startIndex + length - 1) then
      returnValue = returnValue & chr(c)
    end if
    if counter >= startIndex + length then
      OriginalMid = returnValue
      exit function
    end if
  next
end function
    • good
    • 0

私が簡単な例でやるとおかしくないように思うのですが。


メモ帳に下記作成。拡張子.VBSで保存。
Dim fso,f1,objText
Set fso = CreateObject("Scripting.FileSystemObject")
'--
Set f1 = fso.GetFile("C:\Documents and Settings\xxxx\My Documents\text12.txt")
set objText=f1.OpenAsTextStream(1)
Do While objText.AtendOfLine <> True
s=objText.ReadLine
MsgBox s
s1= mid(s,10,len(s)-9)
MsgBox len(s1)
Loop
objText.Close
Set objText=Nothing
Set f1=Nothing
set fso=Nothing
(テキストファイルのあり場所は修正のこと)
ーーー
text12.txt
例データ
123456789東京都大田区
aaaaaaaaa横浜市
eeee12344こんにちは
333334444Clasification
ーー
6,3,5、13と表示されました。
この例やコード内容はおかしいですか。
    • good
    • 0

>テキストファイルを1行ずつ読み、ある桁からある項目A(20桁)…項目Aは漢字が入ります。

後ろ空白(1バイト空白)詰めです。

項目Aが発生するまでは、半角文字列だけですか?
であるなら、項目Aは
strRec1 =Mid(strRecord,10,20)
で正しいです。

漢字桁数は空白(全角や半角)を含まない桁数であれば、
strRec1 =Mid(strRecord,10,20)
LenB(Trim(Replace(strRec1,"□",""))) 'バイト数
Len(Trim(Replace(strRec1,"□",""))) '文字数
です。

さらに、項目Aまでの間に半角と全角が混在するなら
strRec1 = StrConv(MidB(StrConv(strRecord, vbFromUnicode), 10, 20), vbUnicode)
LenB(Trim(Replace(strRec1,"□",""))) 'バイト数
Len(Trim(Replace(strRec1,"□",""))) '文字数
です。

項目Aに半角と全角が混在したバイト数を取得するなら
strRec1 = StrConv(MidB(StrConv(strRecord, vbFromUnicode), 10, 20), vbUnicode)
strRec1 = Trim(Replace(strRec1,"□",""))
LenB(StrConv(strRecord, vbFromUnicode)) 'バイト数
こんな感じで如何ですか?


※ 上記の"□"は全角の空白を示します。
    • good
    • 0

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

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

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

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

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

Qvbsでテキストファイル内の文字列検索

初心者です。

テキストファイルを指定し、含まれる文字列を検索し、
結果表示したいと考えております。

色々探して、以下で作成したのですが、
うまく動いてくれません。

出来ましたら、テキストファイルの中の文字列の
一部分を指定して動作させたいと思っております。

どなたかご教示のほど宜しくお願い致します。


----------------------------------------------------

Set WSHFso = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
Dim strSearchWord

Set tmpFile = WSHFso.OpenTextFile("C:\AAA.txt")

Do Until tmpFile.AtEndOfStream
tmpLine = tmpFile.ReadLine
strSearchWord = strSearchWord & tmpLine & vbcrlf
Loop


Dim SearchWord
SearchWord = split(strSearchWord," ")


if InStr(SearchWord(ix), "test")<>0 then
WScript.Echo " testを含みます。"
else
WScript.Echo " testを含みません。"

end if


----------------------------------------------------

初心者です。

テキストファイルを指定し、含まれる文字列を検索し、
結果表示したいと考えております。

色々探して、以下で作成したのですが、
うまく動いてくれません。

出来ましたら、テキストファイルの中の文字列の
一部分を指定して動作させたいと思っております。

どなたかご教示のほど宜しくお願い致します。


----------------------------------------------------

Set WSHFso = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell...続きを読む

Aベストアンサー

こんにちは。

コードの細かい部分の目的としている部分は良く分からないけれども、少し直してみました。あくまでも、VBSです。元のコードは、ちょっと違うようです。

'-------------------------------------------

Set WSHFso = CreateObject("Scripting.FileSystemObject")
'Set WshShell = CreateObject("WScript.Shell") '??
Dim strSearchWord
dim i
'-------------------------------------------
Public Const FileName ="C:\AAA.txt"
Public Const sWord =""test"
'-------------------------------------------
Set tmpFile = WSHFso.OpenTextFile(FileName)

Do Until tmpFile.AtEndOfStream
tmpLine = tmpFile.ReadLine
i = i + 1
nflg= fSearchWord (tmpLine)
If nflg Then Exit Do
Loop
If nflg Then
MsgBox i & "行目に" & sWord &"を含みます。",64
Else
MsgBox sWord &"を含みませんでした。",48
End If
'-------------------------------------------
Function fSearchWord(tmpLine)
Dim flg
SearchWord = Split(tmpLine," ")
For ix = LBound(SearchWord) To UBound(SearchWord)
If Len(Trim(SearchWord(ix))) > 0 Then
If InStr(1, SearchWord(ix), sWord, 1) > 0 Then
flg = True
Exit For
End If
End If
Next
fSearchWord = flg
End Function
'-------------------------------------------

こんにちは。

コードの細かい部分の目的としている部分は良く分からないけれども、少し直してみました。あくまでも、VBSです。元のコードは、ちょっと違うようです。

'-------------------------------------------

Set WSHFso = CreateObject("Scripting.FileSystemObject")
'Set WshShell = CreateObject("WScript.Shell") '??
Dim strSearchWord
dim i
'-------------------------------------------
Public Const FileName ="C:\AAA.txt"
Public Const sWord =""test"
'---------------------...続きを読む

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

Qbatである文字列内に特定の文字列が含まれているか確認したい

batファイルの中である変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐を作成したいのですが、どのように行なえばよいのでしょうか?

そのまま、ずばりのお答えお待ちしております。

よろしくお願い致します。

Aベストアンサー

大文字小文字を区別しなくていいなら、

if not "%abc:test=%" == "%abc%" echo 含まれていた

区別するなら、

echo %abc% | find "test" >NUL
if not ERRORLEVEL 1 echo 含まれていた

Q【VBScript】変数のスコープ

変数のスコープについて詳しく教えて下さい。

どこで宣言すれば、どこまで有効か知りたい。

条件分岐やループ、ファンクション等でのスコープが分かりません。

特に、ファンクションの中のファンクションとかです。

参考サイトやヒントだけでも良いので教えて下さい。

Aベストアンサー

少し厳しいかもしれませんが、ご自分でサンプルコードを書いて実行してみましたか?
そういう経験の積み重ねが土台を作る一つの要因になるのだと私は思っています。
もしも検証できない状況にあるのでしたら、ごめんなさい。

かく言う私自身、VBScriptには明るくないので、正しいかどうかわかりませんが、
結論から言うと以下の通りかと思っています。

■結論
・グローバル領域(=いかなるプロシージャにも所属しない領域)で宣言された変数は、どこからでも参照可
・プロシージャ内(←ネストレベルは関係ない)で宣言された変数は当該プロシージャ内のみで有効
・プロシージャのネスト時に参照可能な変数は、グローバル変数と自プロシージャ内で宣言された変数のみ(=自分を呼び出した親プロシージャ内の変数を参照することはできない)
・プロシージャの引数がグローバル変数と同名の場合、引数が優先される
・条件分岐やループの内側か外側かは関係ない(内側で宣言した変数を外側で参照できる)
#プロシージャ≒「ファンクション」です。

■参考URL
http://www.google.com/search?q=vbscript+%E5%A4%89%E6%95%B0+%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97
http://www.keynus.co.jp/~uhara/html/vbscript/16.htm

これで答えになっているでしょうか??

少し厳しいかもしれませんが、ご自分でサンプルコードを書いて実行してみましたか?
そういう経験の積み重ねが土台を作る一つの要因になるのだと私は思っています。
もしも検証できない状況にあるのでしたら、ごめんなさい。

かく言う私自身、VBScriptには明るくないので、正しいかどうかわかりませんが、
結論から言うと以下の通りかと思っています。

■結論
・グローバル領域(=いかなるプロシージャにも所属しない領域)で宣言された変数は、どこからでも参照可
・プロシージャ内(←ネストレベルは関係ない)...続きを読む

QVBScriptでCSVファイルを読み出したい

現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。
CSVファイルの中身は、サンプルで
shop,price,sales
001,500,700
003,1200,90
024,,18 という並びになっています。
実データは300件くらいです。
1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。
1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを
2次元配列arrshopに順次保存?したいのです。
----------------------------------------------
dim strLine '1行ずつ読込んだデータを持つ
dim ntLineNum '行数のカウント
dim arrLine '","で区切った要素を持つ一次元配列
dim arrshop '一次元配列になった要素を2次元配列として格納

Do until .AtEndOfStream
  strLine = .ReadLine
  if 0<>strComp("",Trim(strLine)) then
ntLineNum = intLineNum + 1
  end if
  arrLine = split(strLine , ",")
  arrshop = Array(arrLines,i)
i = i + 1
loop
-----------------------------------------
msgbox arrshop(2)(0) と指定すると「003」出るようにしたいです。
Array関数が上手くないような気もします・・・。
どなたかご教授お願いします(>_<。)

現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。
CSVファイルの中身は、サンプルで
shop,price,sales
001,500,700
003,1200,90
024,,18 という並びになっています。
実データは300件くらいです。
1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。
1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを
2次元配列arrshopに順次保存?したいのです。
--------------------------...続きを読む

Aベストアンサー

Arrayのところがおかしいですね。

動くか検証してないですが…
arrshop = Array(arrLines,i)
の代わりに
Redim Preserve arrshop(i+1)
arrshop(i)=arrLines
でやってみてください。
それと最初にiは0か1にでも初期化してから使う事をお勧めします。

Q[VBScript][wsh]byte単位でのデータの切り出し

以前LenBに関して質問した者です。

今回は
「ある文字列の○byte目から△byte分取得する」という処理で困っています。

MidB関数を使うと思うのですが、Unicodeの為、
BASP21の.KconvでSJISに変換してあげています。

HOGEasc = objBasp.Kconv(MidB(tmpLine, ○, △),1)

ここで問題となるのが、切り出した文字列が化けてしまうのです。
以下のようにもう一度Unicodeに変換してあげてもダメです。
HOGEuni = objBasp.Kconv(HOGEasc,4)

いろいろ試してみましたが、お手上げ状態です。
このような処理はできないのでしょうか?

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

Aベストアンサー

>以前LenBに関して質問した者です。
前回の質問については、Openのままでは、回答した私としては、けじめがつきませんから、マナーとして、閉めてくださいませんか?

>tmpLine:"123456789あいうえお"

>開始位置:2 、指定バイト長:5 > "23456"
>開始位置:10、指定バイト長:4 > "あい"

これは、wsf ではありませんが、このようにすればできるのでは?
つまり、byte で数えて、byte 長に満たしたら、その文字の場所を出すという方法です。後は、wsf に合うように、換えてください。それから、あまり、長い文字列は、かなり遅くなりますね。

'bytecount:
tmpline = "123456789あいうえお"
kaishi = 2
wnum = 5
msg ="開始位置:" & kaishi & " 、指定バイト長:" & wnum
Set objBasp = Wscript.CreateObject("Basp21")
k = 1
For i = 1 To Len(tmpline)
ReDim Preserve bufarray(k)
moji =Mid(tmpline,i,1)
bufarray(k) = LenB(objBasp.Kconv(moji, 1, 5))
k = k + 1
Next

For j = 1 To UBound(bufarray)
cnt1 = cnt1 + bufarray(j)
If cnt1 > kaishi Then
Exit For
End If
Next

For m = j To UBound(bufarray)
cnt2 = cnt2 + bufarray(m)
If cnt2 > wnum Then
Exit For
End If
Next
Msgbox msg
MsgBox Mid(tmpline, j, m - j)

>以前LenBに関して質問した者です。
前回の質問については、Openのままでは、回答した私としては、けじめがつきませんから、マナーとして、閉めてくださいませんか?

>tmpLine:"123456789あいうえお"

>開始位置:2 、指定バイト長:5 > "23456"
>開始位置:10、指定バイト長:4 > "あい"

これは、wsf ではありませんが、このようにすればできるのでは?
つまり、byte で数えて、byte 長に満たしたら、その文字の場所を出すという方法です。後は、wsf に合うように、換えてください。それか...続きを読む

QVBScriptで配列のソートをするには?

VBScriptで作成した配列の順番をソートする場合、どのようなコーティングを行えば、実現できるでしょうか?
ソートそのものを実装する関数がありますか?

Aベストアンサー

簡単なものなら
シンプルソート、バブルソート
再起呼び出しなどを使えるレベルならば
マージソート、クイックソート

これらのアルゴリズムの名前で検索をかければ
プログラム例が載っているサイトがみつかりますよ。

QVBScriptで特別な意味を持つ記号を使う方法

VBScriptで簡単なツールをつくっているのですが、「"」のような特殊な働きを持つ文字を文字列として使用するにはどうすればいいでしょうか?

例えば、MsgBoxなどで、「"ファイル名"があります」という表示をさせたい場合、
MsgBox ""ファイル名"があります"
という使い方はできません。

Perlなどでは「'」でくくるなどの方法がありますが、VBScriptでも何か対処する方法はありませんでしょうか?
よろしくお願いいたします。

Aベストアンサー

>MsgBox ""ファイル名"があります"
>という使い方はできません。
惜しい。
MsgBox """ファイル名""があります"
が正解。

文字列の中に「"」を入れる場合は「""」と書く。

「定義ファイル"Program.ini"が見付かりません」と表示する時は
MsgBox "定義ファイル""Program.ini""が見付かりません"
となる。

QVBScriptにて、csvファイルから特定のレコードを取得したい

以下のcsvファイルから例えば、「name」列が「aaa」の行を取得するVBScriptを作成したのですが、うまくいきません。ご教授お願いいたします。
---------------
name,id
aaa,1
bbb,2
ccc,3
---------------

作成したVBScriptは以下のものになります。
(SQL文のWhere句に直接、「where name= 'aaa'」と打つとうまくいきますが、変数を指定したいです。)
-------------------------------------------
Option Explicit

Dim objADO
Dim objRS
Dim strName

strName = "aaa"

'ADOオブジェクトを作成
Set objADO = CreateObject("ADODB.Connection")

'ADOを使いCSVファイルを扱う準備(オープン)を行う
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"DBQ=C:\sagyou\;" & _
"ReadOnly=1"

'SQLを実行し、当該タスクのデータを抽出します
Set objRS = objADO.Execute("select * from test.csv where name= strName")

'レコードセットをクローズobjRS.Close
objRS.Close

'ADOオブジェクトをクローズ
objADO.Close

以下のcsvファイルから例えば、「name」列が「aaa」の行を取得するVBScriptを作成したのですが、うまくいきません。ご教授お願いいたします。
---------------
name,id
aaa,1
bbb,2
ccc,3
---------------

作成したVBScriptは以下のものになります。
(SQL文のWhere句に直接、「where name= 'aaa'」と打つとうまくいきますが、変数を指定したいです。)
-------------------------------------------
Option Explicit

Dim objADO
Dim objRS
Dim strName

strName = "aaa"

'ADOオブジェクトを...続きを読む

Aベストアンサー

VBA みたいに "" を使うとダメみたいですね。失礼しました。
Set objRS = objADO.Execute("select * from test.csv where name='" & strName & "'")
としてみてください。

QVBScriptでMsgBoxのYesNoボックスを自動的にクリックしたい

VBScriptであるボタンをクリックして表示された、MsgBoxの表示されたYes Noボックスを自動的にクリックしたいと考えています。

下記のように、VBScriptでボタンやコンボボックスを選んだりクリックした後にMsgBoxで”はい”、”いいえ”が表示されて、その表示されたMsgBoxで”はい”をクリックしたいのですが、コマンドが分からず困っています。
IEオブジェクト.Document.フォーム名.コンボボックス名.selectedIndex = 0からの番号

Aベストアンサー

MsgBoxの場所が分かっているなら、そのステートメントを削除して、
Yesが返されたようにすれば良いのでは?
Res = MsgBox("~", vbYesNo) → Res = vbYes

どうしてもキー入力にしたい場合はWSHのSendKeyメソッドを使います。
http://msdn.microsoft.com/ja-jp/library/cc364423.aspx

でも、あまり勧められない方法です。キーはその時、フォーカスを
持っているウィンドウに送られますので、確実性に疑問が残ります。


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

人気Q&Aランキング