Excel VBAの問題に関する質問

このQ&Aのポイント
  • Excel VBAの問題で使われる()の意味とは?
  • 文中の「-1」の意味とは?
  • 条件式での「-1」の理由は?
回答を見る
  • ベストアンサー

excelを使用したVBAの問題に関する質問です。

excelを使用したVBAの問題に関する質問です。 下記のサイトの問題13の解答の中で、 http://excel-ubara.com/excel-answer/EXCELVBA613A.html 1, If InStr(Cells(i, 1), "(") > 0 Then とありますが、 "(") はどんな意味を表していて、なんなのでしょうか? 2、 StrPref = Left(Cells(i, 1), InStr(Cells(i, 1), "(") - 1) とありますが、 "(") - 1)のところでなぜ「-1」をしているのでしょうか? 3, If Left(strPref, Len(strPref) - 1) = strCity Then のところについて、 ここでもなぜ「-1」をしているのでしょうか? VBAを始めたばかりの初心者でいて、 理解力が乏しいため お詳しい方がいらっしゃいましたら、この3点につきまして是非、お教え下さい。 よろしくお願い致します。

  • jl777
  • お礼率36% (21/58)

質問者が選んだベストアンサー

  • ベストアンサー
  • mdmp2
  • ベストアンサー率55% (438/787)
回答No.1

Instr(Cells(i,1),"(") は、 Cells(i,1) に文字列が入っており、その中にある ( の位置を表します。 Cells(i,1) にABCDE(12345) という文字列が入っているものとすると、  ( の位置は左から6番目なので、 6という数値を返します。 "(" と、"" でくくるのは文字列であることを表します。 くくらないと、変数とみなされます。 Instr(Cells(i,1),"C") とすると、Cは3番めにありますので3という数値を返します。 Instr(Cells(i,1),C) とすると、Cは変数になりますので、例えばCの値が"C" であれば、同じ結果になります。どこかでC の値を定義しておく必要があります。 なお、( は変数としては使えないでInstr(Cells(i,1),() とすると エラーになります。 Left(Cells(i, 1), InStr(Cells(i, 1), "(") - 1) は、Cells(i,1) に入っている文字列の左から "(" がある場所の数値から一つ引いた数だけ抽出します。 Cells(i,1)="青森県(あおもり)" の場合、"("は4番目にありますので、左から3文字抽出されますので、"青森県" が抽出されます。 -1 がないと、"青森県(" まで抽出され、余分な "(" が付きます。 Left(strPref, Len(strPref) - 1) これは、県名の文字列の左から県名の文字数から1を引いた数の文字列を返します。 県名が"青森県"なら、抽出される文字列は"青森"となります。 -1 は都道府県名から"都","道","府","県" と取り除くためです。

jl777
質問者

お礼

大変に分かりやすいご説明、 ありがとうございました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

Instr 関数に関する質問ばかりじゃないか。 Googleででも、「VBA InStr関数」で照会して、解説例に基づいた解説がある記事を読むこと。そんなこともしてないではね。 VBA プログラムをやるなら、VBAの解説した書籍数冊と、WEB時事の活用は欠かせないよ。 この辺(関数=単機能=定目的のものがほとんど)で質問しているようでは、ロジックなどの勉強はどうするのかな。 ーー Googleで「Instr関数」で照会。 例えば http://officetanaka.net/excel/vba/function/InStr.htm ある文字列があって、「(」=左括弧が最初に現れるまでの文字列の左の部分を取り出したいとき、括弧を見つけた位置の1つ前の文字までをとらえるためー1するのだ。 関数名は、文字列(String)の中で(In)(位置を見つける、という意味かな。昔のMSBasic時代からある有名な関数です。 引数に探索開始位置を指示できるので、2つめ以後の該当を見つけるのにも使えて便利な関数です。 例題 A1セルに aadf(aw)ghr と入れて Sub test01() x = Range("A1") p1 = InStr(1, x, "(") MsgBox p1 p2 = InStr(p1 + 1, x, ")") MsgBox p2 y = Mid(x, p1 + 1, p2 - p1 - 1) MsgBox y End Sub を実行で aw が出る。括弧内の文字列を抜きだす手法。

関連するQ&A

  • excelを使用したVBAの問題に関する質問です。

    excelを使用したVBAの問題に関する質問です。 下記のサイトの問題19の解答の中で、 http://excel-ubara.com/excel-answer/EXCELVBA619A.html '縦合計の客単価 If i = 4 Then Cells(20, j) = Cells(18, j) / Cells(19, j) End If なぜ、週を表している「i」が「4」(if=だったら)なのでしょうか? 「4」だった場合、「合計」欄ではなく、 「第4週目」欄を表すのではないでしょうか? 実は以前にもこの問題19の回答について質問させて頂いております。 しかし、未熟ゆえ、未だに全体的にこの問題の回答が理解できません。 もしよろしければ、 回答全体をひとつずつ「なにがしたいのか」、「どうしてこんなことをしているのか」、について 丁寧にお教え頂けますと、とても助かります。 VBAを始めたばかりの初心者でいて、 理解力が乏しいため お詳しい方がいらっしゃいましたら、是非、お教え下さい。 よろしくお願い致します。

  • VBAについて教えて下さい

    VBAを勉強中しております。詳しい方にお尋ね致します。BシートのP1、Q1を参照して、Aシートの該当セルに貼り付けるコードになります。 If Len(.Cells(i, P1)) > 0 Then Sheets("A").Cells(14, 2) = .Cells(i, P1) Sheets("A").Cells(14, 4) = .Cells(i, Q1) j = j + 1 Q1には数値が入るのですが、この数値が500未満である場合とそうでない場合で表示を変えたいのですが、どのように書いたらいいでしょうか。 Aシートのセルは(14,4)(14,3)(14.4)に以下の処理を反映させたいです。 =IF(q1<500,"<",ROUND(A1/(10^(LEN(A1)-1)),1)) =IF(q1<500,"500","○") =IF(q1<500,"",LEN(A1)-1) よろしくお願い致します。

  • Excel VBAで半角

    Excel VBAで半角 A列が半角のときに、B列にoと表示させるために下記のソースを考えたのですがうまくいきません。初歩的な質問だとは思いますがよろしくお願いします。 Sub 半角判定() Dim i For i = 2 To Range("g65536").End(xlUp).Row If Application.Len(Cells(i, 1)) = Application.LenB(Cells(i, 1)) Then Cells(i, 2) ="o" End If Next End Sub

  • エクセルVBAでの質問

    お世話になります。 エクセルVBAのプログラムコードをコピーし、 エクセルの通常シートへ貼り付けした際、 「’」で始まる説明分または注釈をプロシージャ画面の 様に色づけしたいと思い下記の様なコードを書きました。 しかし、VBA実行後、元のコードが行によって、空白 から始まって行の途中に「’」がある場合など、 少し手前の文字から着色されたりしていました。 何故なのでしょうか。 どこがおかしいのでしょうか。 空白が半角か全角になっている為にこのような現象に なっているのでしょうか。 しかしその解決方法が分からなく、 どなたかご教授頂きたく宜しくお願い致します。   記 Sub サンプル() Dim x As Integer Dim y As Integer Dim z As Integer Dim myrng As String Dim zz As Integer For y = 1 To 10 For x = 1 To Cells(Rows.Count, y).End(xlUp).Row If InStr(Trim(Cells(x, y).Value), "'") = 1 Then Cells(x, y).Font.ColorIndex = 10 ElseIf InStr(Trim(Cells(x, y).Value), "'") = 0 Then Else z = InStr(Trim(Cells(x, y).Value), "'") myrng = Cells(x, y) zz = Len(myrng) Cells(x, y).Characters(z, zz).Font.ColorIndex = 10 End If Next x Next y End Sub

  • エクセル VBA If~Then~Else

    エクセルのA列に以下の文字列が入っています。 A1 A2=100-101 A3=102-103 A4=104-105 A5=106-107 A列の文字列を上から順に結合するため下記のVBAを実行しました。 結合の条件として、文字列の最後の数字と次のセルの最初の数字が連続しているならば、互いに消去して結合、そうでないなら「,」 (カンマ)でつなげて結合したいと思っています。 なので期待する結果としては A1=100----107 となってほしいのですが、実際は A1=100--103,104-105,106-107 となってしまいました。 (ループ中の1回目の条件分岐だけが成功し、2回目以降は違っている) 「IF~Then」の部分が間違っているようなのですが・・・・・わかりません。 プロパティの使い方など全体的に至らぬ点があるかもしれませんがよろしくお願いします。 Dim i As Integer Dim X As String Dim mojisu As String i = 3 X = Cells(i, 1) mojisu = 3 Cells(1, 1) = Cells(2, 1) Do Until Cells(i, 1).Value = "" If Left(X, mojisu) - Right(Cells(1, 1), mojisu) = 1 Then Cells(1, 1).Value = Left(Cells(1, 1), Len(Cells(1, 1)) - mojisu) & Right(X, Len(X) - mojisu) Else Cells(1, 1).Value = Cells(1, 1).Value & "," & Cells(i, 1).Value End If i = i + 1 Loop

  • 【VBA】if文中のinstrの条件2つ

     質問させていただきます。どうぞよろしくお願いいたします。 環境:Excel2010でございます。  If InStr(.Cells(line, 10), "test1") > 0 And InStr(.Cells(line, 10), "test2") > 0 Then'(1) だとIf文の中に入ってきてくれる状況でございます。  If InStr(.Cells(line, 10), "test1") Then'(2)  If InStr(.Cells(line, 10), "test2") Then'(3) の場合は両者ともIf文の中に入ってくるのに、何故  If InStr(.Cells(line, 10), "test1") And InStr(.Cells(line, 10), "test2") Then'(4) だとIf文の中に入ってきてくれないのでしょうか? 自分の考えでは、おそらく(2)も(3)もTrueを返してくれているので (4)の場合は True and Trueで条件に合致するのでは、と思うのでございますが 条件を複数にすると(1)のように数字の比較にしてやらねばいけなくなるのかがよく分かっておりません。 (時々これに気づかずに(4)のようにコーディングしてしまってデバッグしなければいけなくなり手間がかかりますので、できれば理解しておきたい次第でございます。)  もしお詳しい方がいらっしゃいましたら、どうぞよろしくお願いいたします。

  • エクセルVBAを修正したい

    数字を入力すると記号に変換になるマクロを 元ファイルを修正して作成したいのですが、 以下の記述が理解できません。 具体的にどのような処理をしているのか教えて下さい。 Do While Len(Range("C" & CStr(I)) & Range("D" & CStr(I))) > 0 For J = StartCol To EndCol If Len(ActiveSheet.Cells(12, J).Value & ActiveSheet.Cells(13, J).Value) > 0 Then tmp = "" If ActiveSheet.Cells(I, J).Value = "×" Or ActiveSheet.Cells(I, J).Value = "中止" Then ' ActiveSheet.Cells(I, J).Value = "中止" 'ActiveSheet.Cells(I, J + 1).Value = "" Else If Len(ActiveSheet.Cells(I, J).Value) = 0 Then K = -1 Else K = ActiveSheet.Cells(I, J).Value End If Select Case K Case 0 tmp = "×" Case 1 To 9 tmp = "△" Case Is >= 10 tmp = "○" Case Is < 0 tmp = "**" End Select

  • ExcelのVBAで高さの設定

    どなたか教えて下さい。 報告書のフォーマットの作成をしています。 A列からE列までは日付や名前等の内容が入力されています。 F列にはそれに関するコメントが入力されています。 コメントの文字数は、少なければ10字程度、多ければ320文字程度あります。 文字数に合わせて高さを変更させたいです。 その為、以下のような事を行いました。 (1)G列にLEN関数を用いて、文字数を表示 (2)G列の文字数によって高さを変更させるVBAを作成 Sub Macro1() For i = 2 To 100 If Cells(i, 6) < 72 Then Rows(i).RowHeight = 80 ElseIf 73 < Cells(i, 6) < 108 Then Rows(i).RowHeight = 120 ElseIf 109 < Cells(i, 6) < 144 Then Rows(i).RowHeight = 160 ElseIf 145 < Cells(i, 6) < 180 Then Rows(i).RowHeight = 200 ElseIf 181 < Cells(i, 6) < 216 Then Rows(i).RowHeight = 240 ElseIf 217 < Cells(i, 6) < 252 Then Rows(i).RowHeight = 280 ElseIf 253 < Cells(i, 6) < 288 Then Rows(i).RowHeight = 320 ElseIf 289 < Cells(i, 6) < 324 Then Rows(i).RowHeight = 360 End If Next End Sub このVBAに記述間違いがあるようで、 「文字数が72文字以内であれば、高さを80に変更。 文字数が73文字以上で108文字未満であれば、高さは120」 までは認識し・高さの設定を行ってくれますが、108文字以上あっても高さは120になってしまいます。 どなたか教えて下さい。 よろしくお願い致します。

  • エクセルVBAを修正したい

    数字を入力すると記号に変換になるマクロを 元ファイルを修正して作成したいのですが、 同一シートにC9:M33,C9:Y25,O27:Y29といった 範囲の異なる表がある場合はセル範囲をどのように記述すれば良いでしょうか? StartCol = 4 '開始列 EndCol = 20 '終了列 BlankCount = 0 I = 16 '開始行 L = 14 '行の指定 Do While Len(Range("B" & CStr(I)) & Range("C" & CStr(I))) > 0 For J = StartCol To EndCol If Len(ActiveSheet.Cells(L, J).Value & ActiveSheet.Cells(L + 1,J).Value) > 0 Then tmp = "" If ActiveSheet.Cells(I, J).Value = "×" Or ActiveSheet.Cells(I,J).Value = "中止" Then Else If Len(ActiveSheet.Cells(I, J).Value) = 0 Then K = -1 Else K = ActiveSheet.Cells(I, J).Value End If Select Case K Case 0 tmp = "×" Case 1 To 14 tmp = "△" Case Is >= 15 tmp = "○" End Select End If Next I = I + 1 If Len(Range("B" & CStr(I)) & Range("C" & CStr(I))) = 0 Then L = I + 1 I = I + 3 End If Loop End Sub

  • エクセル マクロ 複数セルの色付けについて

    マクロ初心者で苦戦しており、教えていただけると大変ありがたいです。 エクセルの複数のシートに、問2_1 、問2_2 、問2_10 (全部で問は2_28まであります)等の文字列があり、その文字に合わせて、そのセルだけ色を付けたいと考えております。 今書いているコードだと、ワークシートのA列にある場合は色が付けられるのですが、それ以外に色が付けられません。どこが間違っているでしょうか? どうぞご指導お願いいたします。 Sub 色つけ() Dim Maxrow As Long Dim i As Long Maxrow = Cells(Rows.Count, i).End(xlUp).Row For i = 1 To Maxrow If InStr(Cells(i, 1), "2_1 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_2 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_23 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 23 If InStr(Cells(i, 1), "2_13 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 4 If InStr(Cells(i, 1), "2_6 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 7 Next i End Sub

専門家に質問してみよう