はじめまして。
【Access2003】を使用し、タブ区切りのテキストファイル読込をVBAで行っています。
カンマ区切りはわかるのですが、タブ区切りの方法がわからないので教えていただけませんか?

TransferTextを使用したかったのですが、読み込んだデータ1件1件に対して必須と桁数確認を行い、エラーがあった場合はテキストファイルにそのデータ1行を書き込み、エラーがない場合は1行テーブルに書き込みというように処理を分けたいからなのです。
とりあえず今のところカンマ区切りのCSVファイルを読み込むというようにしており、読み込む前にタブ区切りテキストファイルをカンマ区切りCSVファイルに変換する処理を入れようと思っています。
しかしタブ区切りテキストファイルをそのまま読むことができれば一番いいのですが。
ソースは以下の通りです。

'出力元CSVファイルを開く
lngFileNum = FreeFile()
'データ読込
Open strJsnFol & "\\" & strIriInf For Input As #lngFileNum
'CSVファイルの最初の行を読み込む
'CSVファイルより1件分を読み込み
Line Input #lngFileNum, strData
'カンマで区切って配列に代入
varData = Split(strData, ",", , vbTextCompare)
'データ種別のチェック
If varData(0) <> "XXX" Then
MsgBox "ファイルエラーです。", vbInformation + vbOKOnly
intErrFlg = 1
Exit Sub
End If
'タイムスタンプチェック
strSQL = " SELECT CREATE_TIME FROM TB WHERE    CREATE_TIME = '" & varData(1) & "'"
'SQLを実行
If DBAC.ExecSelect(strSQL) = 0 Then
'同じ処理時間のデータがなければ、タイムスタンプを取得
strCreateTime = varData(1)
Else
MsgBox "すでに処理済です。", vbInformation + vbOKOnly
intErrFlg = 1
Exit Sub
End If

'テーブルを開く
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("IF_TB")
'CSVファイルの全レコードを読み込むループ
Do Until EOF(lngFileNum)
'CSVファイルより1件分を読み込み
Line Input #lngFileNum, strData
'カンマで区切って配列に代入
varData = Split(strData, ",", , vbTextCompare)

'データチェック
If varData(0) = "" Or Len(varData(0)) > 12 Then
intChkErr = 1
End If
If varData(1) = "" Or Len(varData(1)) > 12 Then
intChkErr = 1
End If
If Len(varData(2)) > 1 Then
intChkErr = 1
End If
'エラーがあればエラーファイルに書き込み
If intChkErr <> 0 Then
strFileName = strJsnFol & "\\" & "ERR.csv"
lngFileNum2 = FreeFile()
Open strFileName For Append As #lngFileNum2
End If
Print #lngFileNum2, "ERR1," & strData
Close #lngFileNum2
Else
'各フィールドデータをテーブルに追加
With rst
.AddNew
!K_NO = varData(0)
!S_NO = varData(1)
!CD = varData(2)
!CREATE_TIME = strCreateTime
.Update
End With
End If
intChkErr = 0
Loop
rst.Close
Close #lngFileNum
Exit Sub

何かいい方法があれば教えていただけませんか?
よろしくお願いいたします。

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

A 回答 (1件)

>'カンマで区切って配列に代入


>varData = Split(strData, ",", , vbTextCompare)
ここを変えればいいってことではない?

varData = Split(strData, vbTab, , vbTextCompare)
    • good
    • 0
この回答へのお礼

その通りでした。
ありがとうございました。

お礼日時:2009/05/15 11:42

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

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

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

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

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

QFIRE FOX ツールバーの新しいタブボタン消失

FIRE FOXの ツールバーの 新しいタブボタンが 消失しました。
ツールバーのカスタマイズ画面にも 在りません。
何処へ行ってしまったのでしょう。

(注)タブバーの 新しいタブボタンでは ありません。御間違えなく。

Aベストアンサー

意外と気づかない人が居るかもしれませんね。
ツールバーのカスタマイズを開くとタブバーの一番右端に「+」というのが表示されます。
この「+」をツールバーのカスタマイズのウインドウにドラッグ&ドロップします。
そうすると、ツールバーのカスタマイズのウインドウに「新しいタブ」というボタンが出現しますので、これをナビゲーションツールバーへ再度ドラッグ&ドロップします。
これでナビゲーションツールバーに「新しいタブ」を追加することができます。

QIf myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou こちらについて教えていただきたいです。

myTorikomibi = Range("A2").Value
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, 4) = myTantou
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, 14) = myTantou
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou
For i = 1 To 3
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, i + 4) = myTorikomibi
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, i + 14) = myTorikomibi
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, i + 24) = myTorikomibi
Next i
マクロを編集しようとしましたところこちらが解読できづに困っています。
こちらだけとりだして実行しながら解読していますが混乱してしまっています。ご存知の方いらっしゃいましたら教えてください。Then以降がわかりません。よろしくお願いいたします。

myTorikomibi = Range("A2").Value
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, 4) = myTantou
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, 14) = myTantou
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou
For i = 1 To 3
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, i + 4) = myTorikomibi
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, i + 14) = myTorikomibi
If myCityBUNRUINO = 2 Then Cells...続きを読む

Aベストアンサー

こんにちは。maruru01です。

ヘルプはご覧になりましたか?
特に、Cellsについて。
Cellsは、

Cells(行番号, 列番号)

で、セルを参照します。
なので、各条件の時に、変数「myTantou」や「myTorikomibi」に格納されている値をそれらのセルに代入しているだけですが。
ただし、行番号が、

「myPrefNO + 3 - 47」
「myPrefNO + 3 - 47 - myCityNu」

などとちょっとややこしくなっていますが。
これも、変数「myPrefNO」「myCityNu」に入っている値から行番号が決まるというだけです。
例えば、
myPrefNO=60
myCityNu=2
なら、下の例は、
60+3-47-2=14
で、14行目となるということです。

Q●タブブラウザソフト「 sleipnir 」で上のツールバーの表示がおかしくなってしまった。

タブブラウザソフト「sleipnir」を利用しております。

ツールバーの表示がおかしくなり、ネットを見ている際「前の画面に戻る」際のボタンなどの含まれたツールバーが消えてしまいました。

現在残っているツールバーは、アドレス入力のボックスと、検索用のボックスのみです。

左右に「>>」のような記号がありますので、操作自体はそこにカーソルを合わせればできるのですが、ツールバーが復活しません。(><)

ツールバーの復活方法の手順をお教えくださいませ。m( _ _ )m

Aベストアンサー

単に隠れているだけでは?

「>>」の横にある縦に点が並んだ所(カーソルが「←→」になる所)をドラッグ&ドロップで好きな場所に移動する。
点がない場合はツールバー上で右クリック→ツールバーの固定を解除する。

QRst.FindFirst "名称コード" & "=" & "'101'"

タイトルのコードでは問題ないのですが、 101 を文字変数にすると「抽出条件でデータ型が一致していません」のエラーになります。この場合シングルクオーテーションはどういう意味なのでしょうか。
どうすれば良いのでしょうか。

dim Vcode as string
Vcode = "101"
Rst.FindFirst "名称コード" & "=" & Vcode

Aベストアンサー

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます。
そこで、

rst.FindFirst "フィールド名 = 'xxx'"

このようにすればOKです。
次のステップとして、xxx の部分を変数を使ってやりたい場合。
単純に変数名に置き換えると、

rst.FindFirst "フィールド名 = '変数名'"

ですが、変数を、"" の中に記述すると、文字列として扱われますので、"" の外に
出してやる必要があります。
その場合、文字列と変数をつなぐためには、& を使います。

rst.FindFirst "フィールド名 = '" & 変数名 & "'"

で、このようになります。

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます...続きを読む

Qgoogleツールバーが使えるタブブラウザ教えてください。

現在unDonutというタブブラウザを使っていますが
googleツールバーが使えないみたいなので変えようと思っています。

こちらの過去ログで調べてFireFox とLunascapeでは使える
様ですがその他googleツールバーが使える
タブブラウザがあったら教えて下さい。     

googleツールバーが使える物の中で一番使い易いものを
選ぶつもりです。

ネットサーフィンをしていてページランクが見たいだけ
なのでなんでもいいのですが一応全部知りたいのです。

ご回答よろしくお願いします。

Aベストアンサー

lite777さんの調べた通り、利用できるのは

FireFox  Lunascape IE7

です。
ページランクだけの利用であれば問題思いますが
lunaはツールバーのフル機能は使えず、一部機能が動作しません。

QIf Not c Is Nothing Then ~延々処理が続く~ End If

質問というか相談というか
VBAで下記のようなコードをよく見ますし、私自身もこれで書いてます。

For i= 1 to 10
set c=Range.Find(”いろは")
If Not c Is Nothing Then


処理が続く


End If
Next i

cが見つからなかったら、さっさと次の i に進む場合の処理です。Ifの字下げがず~~っと延々続き、最後のNext iの直前でEnd If です。
・Exit For はあるのに 途中Next iは出来ない
・Goto 使って書くと「スパゲティプログラムだ」とか言われる
正直言って、上記コードとGotoスパゲティで可読性に差異があるとは思えません。何でもかんでもGotoはダメていう風潮がおかしいように思えます。

みなさんどうやって書いてますか?

Aベストアンサー

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next i

これって、よく見るとおっしゃっていますが、ひとつ例外に、いわゆる「ブルートフォースアタック(総当り制)」のコードがありますね。それは、Goto 以外に抜け出せる方法がありませんね。「深いネストはするな」という禁を犯しているのだから、Goto 以前のものがあります。(何に使うかはご存知だと思いますし、それをとやかく言う人はいないでしょう。)

これを書き換え、再帰を使うと良いとか言う人もいるのでしょうけれども、そういうのは、知識だけで実際にやったことがない人の話だと思います。「スパゲティ」とか知らない人に、比べさせれば、再帰などを使った方法は、遅くてダメ出しされるのは目に見えています。特殊な例ですが。

ご質問で、実際の私は、内容にもよりますが、
Private flg As Boolean

Sub Main()
On Error Goto ErrHandler
For i= 1 to 10
 Call subRutine(findTxt)
 If flg Then Exit For
Next i
Exit Sub

ErrHandler:
処理
End Sub
'ここの中身はテンプレート化してあります。
Private Sub subRutine(ByVal findTxt) または、Public
'処理
End Sub

としているはずで、モジュールレベルの変数を、flg とし、サブルーチンの中に置いて、目的がかなったら、Flgは、Trueになって、ループから抜け出すようにします。

サブルーチン側では、End ステートメントを使用することさえもあります。(テンプレート化しているのは、Findメソッド、RegExpの正規表現、Sortメソッド、Dictionary とSortLists などがあります。[MZ-Tools 3.0]を使用)

GOTO は、構造化プログラムが登場した時に、排除するように言われてきたものです。古い時代の人は、GOTOに逃げたくなるのを抑えるために、「GOTO」を使うなって、肝に命じてきたのです。しかし、結局、Goto は、なくならなかったのは、一つには、ErrHandlerを使った、エラートラップのせいもあります。だから、Goto を書かないでErr.Raise (513~)で飛ばす方法がありますが、あまり使う人はいません。

ところで、
「スパゲティプログラム」という話に振られると、私は自信がありません。
読みやすさ(可読性)の対極になるものでしょうけれども、誰に対して言っているものか、ということです。私の大事にしている本の中に、アスキーの『QuickBASICプログラミング道場』(1991年)という本があります。

---引用
・本道場で推奨するプログラミングスタイル (p25~)

1.変数・定数・プロシージャーの命名法 (変数の型のサフィックスは使うな)
2.インデントを付けるべし
3.メインプロシージャは短くすべし
4.プロシージャは短くすべし
5.長いブロックはプロシージャーにすべし
6.汎用性のあるプロシージャーを作るべし
7.定数は活用すべし
8.GOTOは乱用(濫用)すべからず。●
 従来のBASICを使ってきた人の中には、GOTO文を多用する人がいるようだ。GOTO文はそのときは便利なように思うが、あとになってリストを眺めてみると、どこに飛んでいるか分からなくなることが多い。……わけがわからない最低の"スパゲティプログラム"になってしまう。
 【例】GOTO文をDOループに置き換える
----引用終わり

現代でも通用するというよりも、その言葉が生まれた時代背景がありますから、必ずしも、GOTOが問題だということではなさそうです。Goto を使わないということにこだわると、逆に墓穴を掘ることになります。

それと、DO ループにするというのは、DO ~ LOOPの間に緊張感(?)は生まれるけれども、無限ループを生み出しやすくなるのです。その頃はそれで良かったかもしれませんが、もうESCでは止まりません。今は必ずしも認められるものではありません。

それと、記録マクロを、そのままVBAプロシージャーに用いるのは、絶対にダメなのですよね。本当のスパゲティプログラムになってしまいます。ベタ書きになってしまうからで、一度、そういうコードを直してくれと言われましたが、怒りを抑えて、丁重にお断りました。

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next...続きを読む

Qエクセルのツールバーとシートタブを隠す!

エクセルのツールバーを「フォント」と「フォントサイズ」だけ残して、シートタブも隠したいのですが、VBAでできますか?

※ 特定のファイルが開かれたときのみ実行させたい(その他は、ユーザーのカスタマイズ通り)
※ Openイベントで実行
※ エクセル97、2000に対応(作成は97)

ツールバーを消してしまうVBAは、結構見つけたのですが、どうもうまく行きません。どなたか宜しくお願いします。

Aベストアンサー

シートタブを隠すのは、ActiveWindow.DisplayWorkbookTabs = False

こんなことしか考えつきませんでした。
表示→ツールバー→ユーザー設定でツールバータブを選択して新規作成し名前を付けます。
次にコマンドタブを選んで編集をクリック。フォントとフォントサイズを新しく作成したツールバーにドラッグ&ドロップします。これをツールバーの位置(上)にドラッグ&ドロップします。
後はこのツールバー以外を非表示にします。(フォントのみのツールバーを作ったわけです)

今、どのようなツールバーが規定値か分かりませんので消したいツールバーはマクロの記録を使いコードの書き方は分かると思います。

書く場所は、ThisWorkbookに下のような感じです。
Private Sub Workbook_Open()
  ActiveWindow.DisplayWorkbookTabs = False
  :
  :
End Sub

ブックを閉じる時は元に戻したほうがいいでしょう。(ThisWorkbook)
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  ActiveWindow.DisplayWorkbookTabs = True
  :
  :
End Sub

シートタブを隠すのは、ActiveWindow.DisplayWorkbookTabs = False

こんなことしか考えつきませんでした。
表示→ツールバー→ユーザー設定でツールバータブを選択して新規作成し名前を付けます。
次にコマンドタブを選んで編集をクリック。フォントとフォントサイズを新しく作成したツールバーにドラッグ&ドロップします。これをツールバーの位置(上)にドラッグ&ドロップします。
後はこのツールバー以外を非表示にします。(フォントのみのツールバーを作ったわけです)

今、どのようなツールバーが...続きを読む

Q条件付きコンパイル: #IF 1 Then と #IF 0 Then

条件付コンパイルで、
『#If 1 Then』と『#If 0 Then』の条件の違いを教えてください。


『#If ○○○=1 Then』などの場合はわかるのですが、
単に『#If 1 Then』の場合は何をもって真となるのでしょうか?

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

Aベストアンサー

条件式は、強制的に「True」又は「False」に解釈されます。

で、「数値」を「True」又は「False」に解釈する場合、
「0」は「False」、「0以外」は「True」になります。
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfctcbool.asp)

つまり、
『#If 1 Then』は、「必ずTrue」=常に有効
『#If 0 Then』は、「必ずFalse」=常に無効
に成ります。

QGoogleツールバーの使えるタブブラウザ

Googleツールバーのように、検索の候補が表示され、タブが使用できるブラウザはありますでしょうか?

IE6を使っていましたが、10個ほど起動すると非常に重くなるため、IE7のタブブラウザを導入してみましたが、あまり軽くなりませんでした。またIE7はカスタマイズ性が無くなったのも残念でした。

便利さ・セキュリティ面など、比較するところはたくさんありますが、とりあえずタブ・検索候補表示(Googleツールバー以外でも構いません)ができるブラウザがありましたら、教えていただけると助かります。

Aベストアンサー

Firefoxに拡張機能のTab Mix Plusを導入して、プラグインの検索エンジン(Google,Yahoo,Gooなどがデフォルトで同梱)を入れたら良いのではないですか。

但し、FirefoxはActiveXコントロールのインストールが必要なサイトでは用が足せません。
その分、セキュリティ上は優位ですが。
(Firefox)
http://www.mozilla-japan.org/products/firefox/

(Tab Mix Plus)
https://addons.mozilla.org/en-US/firefox/addon/1122
(検索エンジン)
http://www.mozilla-japan.org/addons/firefox/search-engines/

Q#If VBA7 Thenに関して

VBAを使っていて

http://blog.goo.ne.jp/mumbai/e/dc90cf94fc40baebf807f1913de4fc10

#If VBA7 Then
Debug.Print "EXCELは2010以上です。"
#Else
Debug.Print("EXCELは2007以下です。")
#End If

というように、#IFというようなものが出てきます。

これの使用方法を知りたいのですが検索して調べたところ、

https://msdn.microsoft.com/ja-jp/library/tx6yas69.aspx

このページに書かれてあるように
#があるとコンパイル時にif文の評価を行うのに対し、
#がないとif文も含めてコンパイルした後に、プログラムを実行する時にif文の評価を行う
といったことが書かれてあります。

それで試してみたのですが


#If VBA7 Then
aa=0
#Else
aa=1
#End If


というコードを実行するとaa=0が代入されます。

一方で

If VBA7 Then
aa=0
Else
aa=1
End If
というコードを実行するとVBA7がemptyになっており
aa=1が代入されます。

これはVBA7という変数がコンパイル時にのみ有効で
実行時には存在しないためだからでしょうか?

VBAを使っていて

http://blog.goo.ne.jp/mumbai/e/dc90cf94fc40baebf807f1913de4fc10

#If VBA7 Then
Debug.Print "EXCELは2010以上です。"
#Else
Debug.Print("EXCELは2007以下です。")
#End If

というように、#IFというようなものが出てきます。

これの使用方法を知りたいのですが検索して調べたところ、

https://msdn.microsoft.com/ja-jp/library/tx6yas69.aspx

このページに書かれてあるように
#があるとコンパイル時にif文の評価を行うのに対し、
#がないとif文も含...続きを読む

Aベストアンサー

少しだけですが、
#If VBA7 Then
aa=0
#Else
aa=1
#End If
の『VBA7』は条件付きコンパイル中で使える定数です。
あらかじめVBAの中に組み込まれています。

で、
If VBA7 Then
aa=0
Else
aa=1
End If
とした場合の『VBA7』は一般的な単なる変数です。

VBEでツール→オプションの編集タブにある「変数の宣言を強制する」に
チェックを入れてあると
「コンパイルエラー :変数が定義されていません」になるはずです。
でチェックを入れていない場合はVariant型として定義されますので
Empty値の初期値は、False、0、"" のいずれかになりますから
If VBA7 Then → False → aa=1 となるわけです。


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

人気Q&Aランキング