ちくのう症(蓄膿症)は「菌」が原因!?

下記のような記述だと1つ目の「天気」の文字列は取得できても
2つ目の「晴れ」の文字列を取得することができません。
どうすれば2つ目の文字列を取得することができるのでしょうか?
※「<」と「>」で挟まれている間の文字列を取得したいです。
※「<」と「>」が何組あるかは不明です。

Dim str0, str1, str2 As Variant
Dim 指定1, 指定2 As Variant

str0 = ”今日の<天気>は<晴れ>です。
指定1 = ”<”
指定2 = ”>”
str1 = Mid(str0, Len(指定1) + InStr(1, str0, 指定1)
str2 = Left(str1, InStr(1, str1, 指定2) - 1)


使用OS:Windows 8
使用ソフト:Microsoft Excel 2007

ご存知の方がおられましたらご回答をよろしくお願いいたします。

A 回答 (2件)

> ※「<」と「>」が何組あるかは不明です。



っていうなら、str1、str2・・・・ じゃダメですよね。
際限なく str3・・・・str100 とか宣言するわけにもいかないし。

Dim str0 As Variant
Dim str1() As Variant
Dim stIdx As Integer
Dim 指定1 As Variant
Dim 指定2 As Variant
Dim ptA As Integer
Dim ptZ As Integer

指定1 = "<"
指定2 = ">"

str0 = "今日の<天気>は<晴れ>です。<雨>や<曇り>だったり<大荒れの嵐>もあるかも。"

ReDim str1(Int(Len(str0) / 2)) As Variant

ptZ = 1
stIdx = 0

Do Until InStr(ptZ, str0, 指定1) = 0
stIdx = stIdx + 1
ptA = InStr(ptZ, str0, 指定1)
ptZ = InStr(ptZ + 1, str0, 指定2)
str1(stIdx) = Mid(str0, ptA + 1, ptZ - ptA - 1)
MsgBox (str1(stIdx))
Loop

解読はご自身でトライしてみてください。
    • good
    • 1
この回答へのお礼

ご回答いただき、ありがとうございました。
とっても分かりやすかった為、すぐに解決する事ができました!

お礼日時:2017/09/20 15:20

こういうときは 私なら、InStr関数を使うかな。


あんまりスマートなコード例じゃないかもしれないけど、解読してみて下さい。


Dim str0, str1, str2 As Variant
Dim 指定1, 指定2 As Variant
Dim ptA As Integer
Dim ptZ As Integer

str0 = "今日の<天気>は<晴れ>です。"
指定1 = "<"
指定2 = ">"

ptA = InStr(1, str0, 指定1)
ptZ = InStr(1, str0, 指定2)

str1 = Mid(str0, ptA + 1, ptZ - ptA - 1)

ptA = InStr(ptZ, str0, 指定1)
ptZ = InStr(ptZ + 1, str0, 指定2)

str2 = Mid(str0, ptA + 1, ptZ - ptA - 1)

MsgBox (str1)
MsgBox (str2)
    • good
    • 0

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

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

Qマクロで行挿入

エクセルでマクロを使って18行ごともしくは24行ごとに行を挿入し挿入したセルに「確定商品」の様にコメントを入れてそれをA1からA2、A3・・・と下に向かって行挿入を繰り返したいのですが、
マクロを使えば可能でしょうか?
※コメントは同じものを使います。

宜しくお願い致します。

Aベストアンサー

こんにちは!

>18行ごともしくは24行ごとに行を挿入し・・・

行挿入・行削除等を行う場合、最終行から上に遡って操作するのが間違いが少ない方法です。
データ数がきっちり18や24で割り切れる数であればそのようなことが可能ですが、
そうでない場合はかなり厄介です。

仮にA列のデータ数が18できっちり割り切れる場合のコードは

Sub Sample1()
Dim i As Long
For i = Cells(Rows.Count, "A").End(xlUp).Row - 17 To 1 Step -18
Rows(i).Insert
Cells(i, "A") = "確定商品"
Next i
End Sub

としても大丈夫だと思います。

※ 個人的には別の方法で

Sub Sample2()
Dim i As Long, lastRow As Long, myRng As Range
Set myRng = Range("A1") '//←最初の行を格納しておく//
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row Step 18
Set myRng = Union(myRng, Cells(i, "A"))
Next i
myRng.EntireRow.Insert
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Range(Cells(1, "A"), Cells(lastRow, "A")).SpecialCells(xlCellTypeBlanks).Value = "確定商品"
End Sub

のような感じでやる方が良いと思います。m(_ _)m

こんにちは!

>18行ごともしくは24行ごとに行を挿入し・・・

行挿入・行削除等を行う場合、最終行から上に遡って操作するのが間違いが少ない方法です。
データ数がきっちり18や24で割り切れる数であればそのようなことが可能ですが、
そうでない場合はかなり厄介です。

仮にA列のデータ数が18できっちり割り切れる場合のコードは

Sub Sample1()
Dim i As Long
For i = Cells(Rows.Count, "A").End(xlUp).Row - 17 To 1 Step -18
Rows(i).Insert
Cells(i, "A") = "確...続きを読む

Q月間勤務表から1日~31日までの各日付ごとに出勤している職員を書き出す方法

月間勤務表から週間勤務表をつくるのに、出勤している職員を抽出して自動かしたいので
手始めに1日~31日までの各日付ごとに職員を抽出する方法を考えたのですがVLOOKUPは使えなさそうなので何かほかの
方法はない物かと、模索していましたが行き詰ってしまいました。
皆様のお力おかしください。

添付した画像が私が使っているエクセルで作製した月間勤務表となります。名前の列に
8・5・7.5が記入してあるのが出勤という意味です、⑧は有給で研は研修と言う意味です。

抽出した名前は別シートに貼り付けたいと思っております。
説明の至らぬ点が多々あるとは思いますが、宜しくお願い致します。

Aベストアンサー

続けてお邪魔します。

>0と表示される個所が所々ありました・・・
「0」が表示されるのは対象セルが空白の場合にそのようになります。

ん~~~
お示しの画像の配置だとかなり厄介ですね。
画像を拝見して、「月間シフト貼り付け」シートのC列氏名は41行目までだと解釈しました。
かなり強引にやってみました。

Sheet2(日付ごと出勤名簿)のA2セルに
=IFERROR(INDEX(月間シフト貼り付け!$C$7:$C$41,SMALL(IF((月間シフト貼り付け!$C$7:$C$41<>"")*(NOT(ISNUMBER(FIND("計",月間シフト貼り付け!$C$7:$C$41))))*((月間シフト貼り付け!F$7:F$41=8)+(月間シフト貼り付け!F$7:F$41=5)+(月間シフト貼り付け!F$7:F$41=7.5)),ROW($A$7:$A$41)-6),ROW(A1))),"")

前回同様、配列数式なのでCtrl+Shift+Enterで確定し
フィルハンドルで列・行方向にコピーしてみてください。

※ 万一、C列氏名に 「計」が含まれる名前(たとえば「加計学園」など)のセルは無視されてしまいます。

※ 本来であればC列(名前列)には名前以外の項目を入れない方が簡単です。m(_ _)m

続けてお邪魔します。

>0と表示される個所が所々ありました・・・
「0」が表示されるのは対象セルが空白の場合にそのようになります。

ん~~~
お示しの画像の配置だとかなり厄介ですね。
画像を拝見して、「月間シフト貼り付け」シートのC列氏名は41行目までだと解釈しました。
かなり強引にやってみました。

Sheet2(日付ごと出勤名簿)のA2セルに
=IFERROR(INDEX(月間シフト貼り付け!$C$7:$C$41,SMALL(IF((月間シフト貼り付け!$C$7:$C$41<>"")*(NOT(ISNUMBER(FIND("計",月間シフト貼り付け!$C$7:$C$41)))...続きを読む

QVBA 複数シートをひとつにまとめる方法について

VBA初心者です。

ブック内の複数シートを
ひとつにまとめる方法について

検索していて見つけた・・・・

Sub Sample()
Dim sWS As Worksheet 'データシート(コピー元)
Dim dWS As Worksheet '集約用シート(コピー先)

Set dWS = Worksheets("AllData")

'集約用シートの2行目以降を削除
dWS.UsedRange.Offset(1, 0).Clear

'各シートの2行目以降のデータを、集約用シートの末尾にコピー
For Each sWS In Worksheets
If sWS.Name <> dWS.Name Then
With sWS.UsedRange

'コピー元シートにデータが1件以上ある場合
If .Rows.Count > 1 Then
.Offset(1, 0).Resize(.Rows.Count - 1).Copy _
Destination:=dWS.Cells(Rows.Count, 1). _
End(xlUp).Offset(1, 0)
End If

End With
End If
Next sWS

'集計用シートをA列で並べ替え
dWS.UsedRange.Sort Key1:=Range("A1"), Header:=xlYes
End Sub

こちらのやり方でばっちりだったのですが
問題点がひとつだけ。

まとめたシートのみでOKなのですが
見出し行の上に工事名やら期間やらを入力する
3~4行を空けておきたいのです。

3~4行・・・・
任意の行数を空けて
その下にまとめる方法を
教えていただけないでしょうか?

よろしくお願いします。

VBA初心者です。

ブック内の複数シートを
ひとつにまとめる方法について

検索していて見つけた・・・・

Sub Sample()
Dim sWS As Worksheet 'データシート(コピー元)
Dim dWS As Worksheet '集約用シート(コピー先)

Set dWS = Worksheets("AllData")

'集約用シートの2行目以降を削除
dWS.UsedRange.Offset(1, 0).Clear

'各シートの2行目以降のデータを、集約用シートの末尾にコピー
For Each sWS In Worksheets
If sWS.Name <> dWS....続きを読む

Aベストアンサー

No.3・4です。

>1行目のSub Sample1()を
>Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
>に置き換えるだけではダメでした。

ダメとは全く反応しない!というコトでしょうか?
もしかしてそのまま標準モジュールに記載していませんか?
そうだとすれば、「Workbookのイベントプロシージャ」でなければ動きません。
VBE画面の左側の下にある「This Workbook」をダブルクリックし、表示されたVBE画面上に

>Sub Sample1()

>Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
に変更してそのままコピー&ペーストしてみてください。

※ もちろん「標準モジュール」のコードは不要なので消去します。m(_ _)m

QExcel2010で頭が0から始まる数字を表示形式以外で0表示させたい

A列の数字「1701」とB列の数字「001」を「concatenate」で繋ぐ際にB列の数字が3桁「001」なんですが、実際にセルに入っているのが「1」なので、繋いだ際に「17011」となってしまいます。
「001」をデータとするにはどうしたらよいのでしょうか?
宜しくお願いいたします。

Aベストアンサー

> 実際にセルに入っているのが「1」なので、
これを、「'001」と入力してみて下さい。
セル結合「&」で繋げることができます。
「'001」と入力されていても、数値計算時には、数字の「1」として認識されます。
お試しを。

QExcel関数で、文字を数字に変換させたいです。 if関数で、数字を文字で表示させることは出来ますが

Excel関数で、文字を数字に変換させたいです。
if関数で、数字を文字で表示させることは出来ますが、その逆はできるのでしょうか?
また、その列を数字の合計で出すことはできますか?

Aベストアンサー

>>例えば、非を1、定を0として表示させることはできますか?

=IF(A1="非",1,IF(A1="定",0,""))

QIF関数 複数条件の組み合わせ

いつもご教授いただきましてありがとうございます。

今回IF関数の複数条件についてご教授頂ければ幸いです。

サンプル画像添付しましたように
D列の作業列③に下記条件が一致したら数字を表示させる数式を組みたいです。
IF、OR関数の組み合わせだと思うのですが、複数条件の組み方が苦手なので
質問させていただきました。

①A列の数字の中でが2(B列商品コードの最初の数字)
  C列の数字の中で04、51、03(B列商品コードの下2桁)だったら1と表示させたい。
※ちなみにC列の条件数値は今後いくつか増える可能性があります。その場合もどういう式にしたらよいか併せてご教授願います。

②A列の数字の中でが2(B列商品コードの最初の数字)
  C列の数字の中で04、51、03(B列商品コードの下2桁)以外だったら2と表示させたい。

③A列の数字の中でが9(B列商品コードの最初の数字)だったら空白にしたい。

お手数をおかけいたしますが、何卒、ご教授願います。

Aベストアンサー

こんにちは!

せっかく作業用の列①・②を作っていらっしゃいますが、一気にC列に表示する数式にしてみました。

C2セルに
=IF(B2="","",IF(LEFT(B2,1)*1=2,IF(ISNUMBER(FIND(RIGHT(B2,2),"04,51,03")),1,2),""))

という数式を入れフィルハンドルで下へこれ以上データが増えることはない!という位まで
しっかりコピーではどうでしょうか?m(_ _)m

Qエクセルで同じデータのかたまりの中で仲間はずれを探す方法

エクセルで、A列にグループ化された文字列があって、B列に数値がある場合、A列が同じ値でB列が同じではない判定はどのようにすればいいでしょうか。
下記の場合、B2とB7が仲間はずれだと知りたいのです。

ご教示いただけますと幸いです。よろしくお願いいたします。

A列 B列
1 AAAA 20170101
2 AAAA 20170102 *仲間はずれ
3 AAAA 20170101
4 AAAA 20170101
5 BBBB 20170103
6 BBBB 20170103
7 BBBB 20170101 *仲間はずれ
8 BBBB 20170103
9 CCCC 20170101

Aベストアンサー

No.2です。

>残念ながらひとつ以上ありそうなんです・・・

少数派の一番数の少ないときに「仲間はずれ」と表示させるようにしてみました。
多数派と少数派 ← 厳密には言い回しが違うかもしれませんが・・・
同数の場合は何も表示されません。

↓の画像のように作業用の列を1列設けてみてはどうでしょうか?
作業列D2セルに
=IF(COUNTIF(A:A,A2)>1,COUNTIFS(A:A,A2,B:B,B2),"")
という数式を入れフィルハンドルでずぃ~~~!っと下へコピーしておき
C2セルに
=IF(AND((D2=MAX(IF(A$2:A$1000=A2,D$2:D$1000)))<>(D2=MIN(IF(A$2:A$1000=A2,D$2:D$1000))),D2=MIN(IF(A$2:A$1000=A2,D$2:D$1000))),"仲間はずれ","")
配列数式なのでCtrl+Shift+Enterで確定!
フィルハンドルで下へコピー!

これで画像のような感じになります。m(_ _)m

Qマクロを組んだエクセルのデータを別のエクセルにコピペしたことが原因で・・・

win7使用してます。以前に,アクティブセルの行と列に十文字のラインが入るようにネットで調べたマクロを入力してみました。そのせいなのだと思うのですが,そのデータを別のエクセルにコピペして使うのですが,そのコピペ先のエクセルシートのセルがランダムに青くなるようになりました。
範囲選択をしてその青い部分を覆うと,消えたり消えなかったりしたり,いったん画面外にスクロールし戻ると消えていたり・・そのままも。枠だけが水色(この色はコピペ元のシートで入力したマクロで指定した色)になったりもします。これも同様,消えたり現れたりを繰り返します。恐らくマクロを組んだシートのデータなので,何か余分なものまで持ってきてしまっているような状態なのだと思います。いろいろ調べていますが同じ症例が見当たらず,改善策を教えて頂きたく質問させて頂きました。
有識の方よろしくお願いします。

Aベストアンサー

No.1 の追補

標準モジュールではなくシートモジュールやワークブックモジュールにコードは残っていませんか?
下図の赤く囲まれた部分をクリックしてみてください。

Qエクセル。1から12が循環。

お世話になります。
下記内容をエクセルの計算式で可能ですか?

A1に1と入力→B1,C1に2 3と反映

6と入力→7 8と反映

12と入力→1 2と反映

言葉足らずな点は補足いたします。
よろしくお願いいたします。

Aベストアンサー

同じ解答があるのかな?重複がありましたら、ごめんなさい。

これって、月数の計算ですよね。
B1:
=MOD(A1,12)+1
C1:
=MOD(B1,12)+1

QエクセルでLOOKUP関数など使いこなせない

体力測定記録で年齢、得点を入れたら評定基準でABCDを返すようにしたい。
例えば  年齢72 得点35     評定段階 C
Cを求める数式を知りたい。どなたかよろしくお願いします。

Aベストアンサー

こんにちは!

一例です。
↓の画像のE1~H6セルのように表を作成しておきます。

C2セルに
=IF(COUNTBLANK(A2:B2),"",INDEX(E$2:E$6,MATCH(B2,OFFSET(E$2:E$6,,MATCH(A2,F$1:H$1,1)),1)))

という数式を入れフィルハンドルで下へコピーしています。

※ 表の並びを少しだけ説明すると・・・
F列 → 0歳以上~70歳未満
G列 → 70歳以上~75歳未満
H列 → 75歳以上
となり、行方向に関しても同様な区分けになり、
仮にF列の場合は
2行目 → 0以上~25未満
3行目 → 25以上~33未満
4行目 → 33以上~41未満
5行目 → 41以上~49未満
6行目 → 49以上
といった具合です。

他の列も同様の感じになります。m(_ _)m


人気Q&Aランキング