• ベストアンサー

WORDのVBAについて教えてください

muunoyの回答

  • ベストアンサー
  • muunoy
  • ベストアンサー率38% (70/183)
回答No.2

>3番目のデータは「○」か"なし"か "なし"というのは、「配列要素がない」ということでしょうか? エラーになるとすれば、そういうことを言いたいのだろうかと思われます。 エラーの原因は、配列変数strSearchに、存在しないIndex=3の要素を参照していることです。 エラーメッセージは、「実行時エラー '9': インデックスが有効範囲にありません。」ではないですか? そうであれば、下記のように、strSearchに、Index=3が存在する時にだけ内容を参照するように変更すれば、エラーは回避できます。 Ubound関数は、最も大きい要素番号を返すマクロ関数です。(参照URLに詳細) Sub TEST() Dim strSearch() As String Dim strList As String Dim Flag As Boolean '処理フラグ strSearch() = Split(strList, vbTab) Flag = False '初期化 If UBound(strSearch) < 3 Then Flag = True 'strSearch(3)が存在しない場合は、処理フラグをTrueにする ElseIf strSearch(3) = "○" Then Flag = True End If If Flag = True Then  '処理フラグがTrueなら処理Aを実行する MsgBox "処理A" End If End Sub また、単純に"なし"か"○"かのいずれかの文字列の時に処理をするようにしたいのであれば、 If strSearch(3) = "なし" Or strSearch(3) = "○" Then というIf文です。念のため、こちらも書いておきます。

参考URL:
http://officetanaka.net/excel/vba/tips/tips62.htm
kihonkana
質問者

お礼

"なし"というのは、「配列要素がない」ということでしょうか? その通りです。 UBound関数を使ってうまくいきました。 ありがとうございます。

関連するQ&A

  • 【Access2003】VBAでタブ区切りテキストファイル読込

    はじめまして。 【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 何かいい方法があれば教えていただけませんか? よろしくお願いいたします。

  • Excel VBA 条件分岐のスマートな書き方

    すみません。すごく初歩的な質問なのですが、 Excel VBAで以下のような条件分岐をさせたい場合、 もっとスマートな書き方できませんか? 命題 AとBに対して if not A then 処理X end if if not B then 処理Y end if if not(A and B) then 処理Z(この処理の中には処理Xと処理Yの結果が含まれている) end elseifを使った書き方が思い浮かばず、 同じことを何度も書いているようで、もっと上手に書けそうな気がしまして・・・ どなたかご教示頂けたらと思います。

  • VBA beforeprintについて

    Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "sheet1" Then If Range("M1").Value = "" Then Cancel = True MsgBox ("名前を入力してください") Range("M1").Select Exit Sub End If ElseIf ActiveSheet.Name = "sheet2" Then If Range("A47").Value = 文字 Then Cancel = True    MsgBox ("日付を入力してください") Range("A47").Select Exit Sub End If Exit Sub End If End Sub 上記は印刷をする前に実行されるコードですが、上記を実行して印刷をした後に自動で下記のVBAを実行したいのですが Sub データー取り込み() ActiveSheet.Range("B2000:Z2000").Copy ChDir "\\データーA\データーB\データーC\データーD" Workbooks.Open Filename:="\\データーA\データーB\データーC\データーD\データーシート1.xls" Sheets("顧客データー").Select If Worksheets("顧客データー").Range("B18").Value = "" Then Worksheets("顧客データー").Range("B18").PasteSpecial Paste:=xlPasteValues Else Worksheets("顧客データー").Range("B65536").End(xlUp).Offset(1, 0).PasteSpecial _ Paste:=xlPasteValues End If ActiveWorkbook.Save ActiveWindow.Close End Sub 上記のコードと下記のコードをどのように絡めたらいいのかわかりません。アドバイスお願いします。

  • VBA条件分岐で教えてください。

    以下のプログラムは一つのセルに複数行のデータがあるとき それぞれの行を独立したデータとして取り出すように計画しています。 それぞれのセルは一行のもの、二行のもの、三行のものとバラバラです。 行のデータが無くなったら次のNEXTを実行させたいのですがうまくいきません。 (現在はメッセージボックスを表示させていますが) 以下のプログラムを実行するとデータがある行は表示しますがデータの無い行に行くと「インデックスが有効範囲にありません」とエラーが出ます。 For n = 4 To 6 A1 = Cells(n, 1) '連番 A2 = Cells(n, 2) 'タイム A3 = Cells(n, 3) '日本語 A4 = Cells(n, 4) Dim tmp As Variant tmp = Split((A4), vbLf) MsgBox tmp(0) If tmp(1) <> "" Then MsgBox tmp(1) End If If tmp(2) <> "" Then MsgBox tmp(2) End If A5 = Cells(n, 5) 'オプション 'テキスト出力 Open "G:\Data.txt" For Append As #1 Print #1, A1; Chr(9); A2; Chr(9); A4 ' Chr(9)はTABスペースのことです。 Close #1 Next VBA初心者です。 よろしくお願いします。

  • VBAについて

    以下のプログラムは、1年間の価格合計を求めるプログラムです。 これを実行するとうまくいくこともありますが、エラーが起きることもあります。 どうやら下記コードが原因のようなのですが、間違いがわかりません。 Target.Offset(0, 1).Value = run * (13 - month) どこが間違っているのでしょうか。 また最終的に、A行かB行のどちらかが更新されたときにこのプログラムを 実行させたいのですが、方法がわかりません。 無知な質問ではありますが、どなたか教えてください。 --------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim month As Integer Dim run As Integer If Intersect(Target, Range("A25:A35")) Is Nothing Then Exit Sub Else If Target.Offset(0, -2).Value <> "" Then month = Target.Offset(0, -2).Value month = month - 3 If month = -2 Then month = 10 ElseIf month = -1 Then month = 11 ElseIf month = 0 Then month = 12 End If run = Target.Offset(0, 0).Value Target.Offset(0, 1).Value = run * (13 - month) End If End If End Sub

  • 条件による行挿入VBAの統合

    Bookごとのデータの内容により次の3つをその都度使い分けていますが これをひとつのVBAに統合したいのですが書き方を教えてください。 (当方詳しくないのでこのVBAも教えられたままのもので自作ではありません) ※A列データのうちタイトル行には■を先頭に入れてあります。 ●「■」があればすべて分割(■タイトルの上の行に1行挿入) Sub 全分割() Dim r As Long For r = 140 To 2 Step -1 If InStr(Cells(r, "A").Value, "■") > 0 Then Rows(r).Insert End If Next End Sub ●タイトルに(1)または(2)が含まれる場合は (1)の上で分割(■の上の行に1行挿入)、(2)のあるA列はセル消去 Sub かっこ2有り分割() Dim r As Long For r = 140 To 2 Step -1 If InStr(Cells(r, "A").Value, "■") > 0 Then If InStr(Cells(r, "A").Value, "(2)") > 0 Then Cells(r, "C").ClearContents End If If InStr(Cells(r, "A").Value, "(1)") > 0 Then Rows(r).Insert End If Cells(r, "A").ClearContents End If Next End Sub ●上記混在の場合(かっこありタイトルとかっこなしタイトルが混在) Sub 混在分割() Dim r As Long For r = 140 To 2 Step -1 If InStr(Cells(r, "A").Value, "■") > 0 Then If InStr(Cells(r, "A").Value, "(2)") > 0 Then Cells(r, "A").ClearContents End If If InStr(Cells(r, "A").Value, "■") > 0 Then Rows(r).Insert End If End If Next End Sub ※かっこ有りに(3)もある場合、(2)と同じ処理 3つを統合した場合の分類のルール A列に■のあるタイトルの処理 ■のあるタイトルごとにタイトルの上に1行挿入 ただしタイトルに(2)(3)が含まれる場合は、上に行挿入せずそのタイトル部分(A列)のセル消去 A列の状況 ■タイトル データ1 データ2 データ3 ■タイトル(1) データ1 データ2 データ3 ■タイトル(2) データ4 データ5 データ6 ■タイトル データ1 データ2 データ3 A列の処理状況 (行挿入) ■タイトル データ1 データ2 データ3 (行挿入) ■タイトル データ1 データ2 データ3 (空白) データ4 データ5 データ6 (行挿入) ■タイトル データ1 データ2 データ3 なおデータの数字(連番)はD列に入れてありますが、 上記ルールにより■のあとや(2)(3)のとき同一タイトルなら連番にしてあるので この1の行を分割の判定としてもいい Office2013/Windows7

  • VBA このような出力は不可能でしょうか?

    Public Function first_date() i = 1 '←追加されるライン kidou = 2011 / 2 / 20   '←追加されるライン If i <> 1 Then With ThisWorkbook.VBProject.VBComponents("Module_first").CodeModule .InsertLines 2, vbTab & "i = 1" .InsertLines 3, vbTab & "kidou = " & Date + 10 End With MsgBox "1回目:起動期限 " & Date + 10 Exit Function Else MsgBox "2回目:起動期限は" & kidou End If End Function このような形でVBAの使用期限を自身のVBE書き込むという事をしたいのですが2回目以降のデータの取得が上手くいきません。 ただ単に変数kidouの型が上手く取得出来ず変な値が出てるだけのようなのですが、こういうデータの取得方法は不可能なのしょうか? 3行目の追加方法として一番ベストな方法を教えて頂ければと思います。色々やってみたのですが上手くいかず困ってます。 よろしくお願い致します。

  • ▲ExcelのVBA▼困っています

    何度もVBAで質問させてもらい助けてもらっています。 懲りずにまた質問ですが… 下のプログラムは"●"が跳ね返るものなのですが… ●の後を■と▲が追うようなプログラムにするには なにを追加すればいいのでしょうか…?; どなたか教えて下さい;;お願いします;; Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim maru As String, yoko As String, tate As String Sub 描画() Cells(X, Y).Value = maru End Sub Sub 削除() Cells(X, Y).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() If yoko = "右" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 30 Then yoko = "左" ElseIf Y = 1 Then yoko = "右" End If If tate = "上" Then X = X + 1 Else X = X - 1 End If If X = 20 Then tate = "下" ElseIf X = 1 Then tate = "上" End If End Sub Sub main() maru = "●" X = 1 Y = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub

  • ExcelVBAのプログラムをJavaへ変換

    if(a <>"A" And b<> "A" ) Then 処理 End if というプログラムがありました。 <>の部分がよくわからないです。 これをJavaに変換するとすれば、どの様なプログラムになるのでしょうか? 教えていただけるとありがたいです。

  • VBA if文の作法

    if a=1 then b=1 end if を if a=1 then b=1 と書けますよね。 しかし、以下のような書き方だとa=1がFALSEでもその次のif b=1 then c=1の判定をしに行きます。なぜこの書き方がいけないのでしょうか? if a=1 then if b=1 then c=1 end if