文字列を加工してデータ転記する(その3)

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

演習問題テーマ:文字列を加工してデータ転記する(その3)

Instr関数をつかって「" "」で、区切りの「スペース」が何文字目にあるのかも調べられるというのがポイント。

[1]Instr関数をつかって区切りの字(ここではスラッシュや半角スペース)が何文字目にあるかを調べる変数を使う
[2]区切りの字の前か後かを変数-1、変数+1であらわす
[3]区切りの字が複数ある場合はInstr関数が区切りの字の有無を判別することを利用してIf文を使う
の3点をしっかり復習してください。

この教材についての過去の質問・感想

11047 : 小川慶一の回答 (2019-01-30 09:58:13)

受講生 さん:

お返事ありがとうございます。

特にインデントについては、遠回りなようで、最終的に近道です。

ひきつづきよろしくお願いいたします。


> お世話になります。ご回答ありがとうございました。
>
> 英語を使わない理由がわかりました。その他についてもいただいたアドバイスを参考にいたします。
>
> 小川慶一さん:
>
> > 受講生 さん:
> >
> > 次回からは、相談時は、実際に作ったコードをまるまる貼り付けてください。
> > 最初の行は sub となっています。
> > そこから、少なくともこの部分はあとから手書きで追加したものではないか?と推測しました。
> > それで、こういうお願いを書いています。
> >
> > プログラムの修正点は、以下のプロシージャ内に僕がしたコメントを参照ください。
> >
> >

sub renshu2()
> >   Dim slush
> >   Dim name
> >   
> > Dim gyo
> > For gyo = 2 To 11
> >  name = Range("b" & gyo).Value
> >  slush = InStr(name, "/")
> >  If name = 0 Then '調査対象は、 変数 name ではなく、変数 slush
> >  slush = InStr(name, " ")
> >  End If
> >  Range("C" & gyo).Value = Left(name, slush-1)
> >  Range("D" & gyo).Value = Mid(name, slush + 1)
> >   
> > Next
> > End Sub

> >
> > それから、以下は、このプログラムについての追加コメントです。
> >
> > [1]
> > インデントしっかり入れてください。僕が書いたコードと同じになるように。
> > 昨日のメールマガジンでも書きましたが、僕の動きをそのままマネることです。
> > 今回の問題をご自身で見破れないのも、整形がなっていないために、コードが読みにくい状態になっているからです。
> >
> > [2]
> > 変数名に英単語一語のものを使うのは避けましょう。
> > 以下の2つの理由からです。
> >
> > [2-1]
> > VBAで実際に使われているキーワードと重複する可能性が高いからです。
> > 「name」というのは、まさに、worksheetオブジェクトのプロパティに存在します。
> > そういう変数名を使うのは、混乱や思わぬ誤動作の元です。
> >
> > [2-2]
> > スペルをミスすると、バカに見えるからです。
> > 参考までに、「スラッシュ」は、英語では、「slush」ではなく、「slash」と書きます。
> > ひょっとすると英語での意図的に「slush」と書かれたのかもしれませんが、このプログラムはその他の部分から醸し出される雰囲気がダメぽいので、残念ながらそうは思ってもらえないでしょう。
> >
> > ということなのでおすすめは:
> > name → namae
> > slush → kugiri
> > とかですかね。
> >
> > よろしくお願いいたします。
> >
> >
> > > お世話になります。問題3について質問させてください。
> > > 下記のようにコードを書きました。小川先生と同じように書いたつもりですが、動きません。実行時エラー5と表示されます。そこで試しにRange("C" & gyo).Value = Left(name, slush - 1)をRange("C" & gyo).Value = Left(name, slush )としたところ、動くようになりました(/は入ってしまいますが)。今回のコードにはもう1つ問題があります。半角空欄を認識していません。なぜダメなのかお手数ですが、ご回答お願いいたします。
> > >
> > > sub renshu2()
> > > Dim slush
> > > Dim name
> > >
> > > Dim gyo
> > > For gyo = 2 To 11
> > > name = Range("b" & gyo).Value
> > > slush = InStr(name, "/")
> > > If name = 0 Then
> > > slush = InStr(name, " ")
> > > End If
> > > Range("C" & gyo).Value = Left(name, slush-1)
> > > Range("D" & gyo).Value = Mid(name, slush + 1)
> > >
> > > Next
> > > End Sub
> > >
> > >


11044 : 受講生さんのコメント (2019-01-30 08:41:43)

お世話になります。ご回答ありがとうございました。

英語を使わない理由がわかりました。その他についてもいただいたアドバイスを参考にいたします。

小川慶一さん:

> 受講生 さん:
>
> 次回からは、相談時は、実際に作ったコードをまるまる貼り付けてください。
> 最初の行は sub となっています。
> そこから、少なくともこの部分はあとから手書きで追加したものではないか?と推測しました。
> それで、こういうお願いを書いています。
>
> プログラムの修正点は、以下のプロシージャ内に僕がしたコメントを参照ください。
>
>

sub renshu2()
>   Dim slush
>   Dim name
>   
> Dim gyo
> For gyo = 2 To 11
>  name = Range("b" & gyo).Value
>  slush = InStr(name, "/")
>  If name = 0 Then '調査対象は、 変数 name ではなく、変数 slush
>  slush = InStr(name, " ")
>  End If
>  Range("C" & gyo).Value = Left(name, slush-1)
>  Range("D" & gyo).Value = Mid(name, slush + 1)
>   
> Next
> End Sub

>
> それから、以下は、このプログラムについての追加コメントです。
>
> [1]
> インデントしっかり入れてください。僕が書いたコードと同じになるように。
> 昨日のメールマガジンでも書きましたが、僕の動きをそのままマネることです。
> 今回の問題をご自身で見破れないのも、整形がなっていないために、コードが読みにくい状態になっているからです。
>
> [2]
> 変数名に英単語一語のものを使うのは避けましょう。
> 以下の2つの理由からです。
>
> [2-1]
> VBAで実際に使われているキーワードと重複する可能性が高いからです。
> 「name」というのは、まさに、worksheetオブジェクトのプロパティに存在します。
> そういう変数名を使うのは、混乱や思わぬ誤動作の元です。
>
> [2-2]
> スペルをミスすると、バカに見えるからです。
> 参考までに、「スラッシュ」は、英語では、「slush」ではなく、「slash」と書きます。
> ひょっとすると英語での意図的に「slush」と書かれたのかもしれませんが、このプログラムはその他の部分から醸し出される雰囲気がダメぽいので、残念ながらそうは思ってもらえないでしょう。
>
> ということなのでおすすめは:
> name → namae
> slush → kugiri
> とかですかね。
>
> よろしくお願いいたします。
>
>
> > お世話になります。問題3について質問させてください。
> > 下記のようにコードを書きました。小川先生と同じように書いたつもりですが、動きません。実行時エラー5と表示されます。そこで試しにRange("C" & gyo).Value = Left(name, slush - 1)をRange("C" & gyo).Value = Left(name, slush )としたところ、動くようになりました(/は入ってしまいますが)。今回のコードにはもう1つ問題があります。半角空欄を認識していません。なぜダメなのかお手数ですが、ご回答お願いいたします。
> >
> > sub renshu2()
> > Dim slush
> > Dim name
> >
> > Dim gyo
> > For gyo = 2 To 11
> > name = Range("b" & gyo).Value
> > slush = InStr(name, "/")
> > If name = 0 Then
> > slush = InStr(name, " ")
> > End If
> > Range("C" & gyo).Value = Left(name, slush-1)
> > Range("D" & gyo).Value = Mid(name, slush + 1)
> >
> > Next
> > End Sub
> >
> >


11042 : 小川慶一の回答 (2019-01-30 08:05:02)

受講生 さん:

次回からは、相談時は、実際に作ったコードをまるまる貼り付けてください。
最初の行は sub となっています。
そこから、少なくともこの部分はあとから手書きで追加したものではないか?と推測しました。
それで、こういうお願いを書いています。

プログラムの修正点は、以下のプロシージャ内に僕がしたコメントを参照ください。

sub renshu2()
  Dim slush
  Dim name
  
Dim gyo
For gyo = 2 To 11
 name = Range("b" & gyo).Value
 slush = InStr(name, "/")
 If name = 0 Then '調査対象は、 変数 name ではなく、変数 slush
 slush = InStr(name, " ")
 End If
 Range("C" & gyo).Value = Left(name, slush-1)
 Range("D" & gyo).Value = Mid(name, slush + 1)
  
Next
End Sub


それから、以下は、このプログラムについての追加コメントです。

[1]
インデントしっかり入れてください。僕が書いたコードと同じになるように。
昨日のメールマガジンでも書きましたが、僕の動きをそのままマネることです。
今回の問題をご自身で見破れないのも、整形がなっていないために、コードが読みにくい状態になっているからです。

[2]
変数名に英単語一語のものを使うのは避けましょう。
以下の2つの理由からです。

[2-1]
VBAで実際に使われているキーワードと重複する可能性が高いからです。
「name」というのは、まさに、worksheetオブジェクトのプロパティに存在します。
そういう変数名を使うのは、混乱や思わぬ誤動作の元です。

[2-2]
スペルをミスすると、バカに見えるからです。
参考までに、「スラッシュ」は、英語では、「slush」ではなく、「slash」と書きます。
ひょっとすると英語での意図的に「slush」と書かれたのかもしれませんが、このプログラムはその他の部分から醸し出される雰囲気がダメぽいので、残念ながらそうは思ってもらえないでしょう。

ということなのでおすすめは:
name → namae
slush → kugiri
とかですかね。

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


> お世話になります。問題3について質問させてください。
> 下記のようにコードを書きました。小川先生と同じように書いたつもりですが、動きません。実行時エラー5と表示されます。そこで試しにRange("C" & gyo).Value = Left(name, slush - 1)をRange("C" & gyo).Value = Left(name, slush )としたところ、動くようになりました(/は入ってしまいますが)。今回のコードにはもう1つ問題があります。半角空欄を認識していません。なぜダメなのかお手数ですが、ご回答お願いいたします。
>
> sub renshu2()
> Dim slush
> Dim name
>
> Dim gyo
> For gyo = 2 To 11
> name = Range("b" & gyo).Value
> slush = InStr(name, "/")
> If name = 0 Then
> slush = InStr(name, " ")
> End If
> Range("C" & gyo).Value = Left(name, slush-1)
> Range("D" & gyo).Value = Mid(name, slush + 1)
>
> Next
> End Sub
>
>


11037 : 受講生さんのコメント (2019-01-30 05:59:29)

お世話になります。問題3について質問させてください。
下記のようにコードを書きました。小川先生と同じように書いたつもりですが、動きません。実行時エラー5と表示されます。そこで試しにRange("C" & gyo).Value = Left(name, slush - 1)をRange("C" & gyo).Value = Left(name, slush )としたところ、動くようになりました(/は入ってしまいますが)。今回のコードにはもう1つ問題があります。半角空欄を認識していません。なぜダメなのかお手数ですが、ご回答お願いいたします。

sub renshu2()
Dim slush
Dim name

Dim gyo
For gyo = 2 To 11
name = Range("b" & gyo).Value
slush = InStr(name, "/")
If name = 0 Then
slush = InStr(name, " ")
End If
Range("C" & gyo).Value = Left(name, slush-1)
Range("D" & gyo).Value = Mid(name, slush + 1)

Next
End Sub


10637 : 小川慶一の回答 (2018-10-10 11:15:47)

ゲストさん:

その後どうでしょうか。お役に立てればと思っています。

>まあそれだけではないですがまだまだ勉強の足りなさを感じております

作法は大切ですよ。
慌てて加工したプログラムだとしても、型に従わなかったことは一目瞭然です。


> 小川先生
>
> 以下の件かなり参考になりました。
> 仕事上、ばれてしまうことがあるので朝、名前変数等急いで加工してしまいました。(まあそれだけではないですがまだまだ勉強の足りなさを感じております。)
>
> もう一度書かれていた件は振り返り学習をしようと思います。
> まだまだ発展まで行きませんが、確実に勉強していきたいと思っております。
>
> 丁寧な対応ありがとうございました。


10628 : ゲストさんのコメント (2018-10-03 21:26:22)

小川先生

以下の件かなり参考になりました。
仕事上、ばれてしまうことがあるので朝、名前変数等急いで加工してしまいました。(まあそれだけではないですがまだまだ勉強の足りなさを感じております。)

もう一度書かれていた件は振り返り学習をしようと思います。
まだまだ発展まで行きませんが、確実に勉強していきたいと思っております。

丁寧な対応ありがとうございました。


10624 : 小川慶一の回答 (2018-10-03 07:00:41)

ゲストさん:

添削を返送します。
このエクセルファイル、このまま講座用資料として公開させてもらっても良いでしょうか?

'[a], [b], [c]から、先々がかなり心配です。
'「ハナコのステップ」とか、しっかり学んでください。このままだと、あとあと早々に行き詰まります。
'基礎編フォローベーシックでなんとか。アドバンスドには太刀打ちできない、というくらいで終ってしまうでしょう。
'全問題、「エクセル上での結果が同じになった」で満足せず、「何も見ないで書いても小川さんが書いたのと同じ形になる」というところまで、身体に叩き込むつもりで動作練習してください。
'[a]プロシージャ名ひどいです
Sub a()
'[b]↓インデントいれましょう
Dim r As String


Range("A2").Value = InStr(Range("A1").Value, "本")
Range("A3").Value = Mid(Range("A1").Value, Range("A2") + 3)
Range("A4").Value = Left(Range("A3").Value, 3)
If Left(Range("A4").Value, 3) = "|" Then
r = Left(Range("A4").Value, 2)

Else: r = Left(Range("A4").Value, 3) '[c] 一行にまとめない


End If

End Sub

Sub kaitorei()
    Dim qr
    Dim hon
    Dim pp1
    Dim pp2
    qr = Range("A1").Value
    
    hon = InStr(qr, "本")
    pp1 = InStr(hon + 1, qr, "||")
    pp2 = InStr(pp1 + 2, qr, "|")
    
    Range("G20").Value = "hon"
    Range("G21").Value = hon
    
    Range("H20").Value = "pp1"
    Range("H21").Value = pp1
    
    Range("I20").Value = "pp2"
    Range("I21").Value = pp2
    
    Range("D22").Value = Mid(qr, pp1 + 2, pp2 - pp1 - 2)
    Range("E22").Value = Mid(qr, pp2 + 1)
End Sub


なお、この問題は、今は基礎編レベルの知識と実力しかないのでこういうゴリゴリした方法でしかやれませんが、発展編2レベルの知識と実力がつくともっと簡単に解けます。
今の段階では、こういうやり方でいくより仕方ないですね。

基礎編本編第3章の Instr 関数のところは再復習してください。Instr関すで "||" をさがしてたとえば26という数字が返ってきたなら、 "||" の左側の "|" が26文字目にあります。右側のは27文字目。
すると、 "||" のあとの文字は、28文字目、ということになります。
それから、何度も登場する値は変数に格納すること。基礎編本編第1章の「変数」以降を復習してください。


とりいそぎ。


> 小川先生
> 早急にお返事いただいてありがとうございました。
>
> 早速ですがおくります。
> よろしくお願いいたします。
>


10622 : 小川慶一の回答 (2018-10-03 06:42:16)

ゲストさん:

最初の投稿でファイル受領できています。
エラーがでてしまいましたか。それはすいません。システム担当に調査させます。

ファイル内容確認のうえ、またお返事差し上げますね。
よろしくお願いいたします。

> 小川先生
> 早急にお返事いただいてありがとうございました。
>
> 早速ですがおくります。
> よろしくお願いいたします。
>


10621 : ゲストさんのコメント (2018-10-03 06:38:15)

エラーが出たのでもう一度送ります。


10620 : ゲストさんのコメント (2018-10-03 06:37:12)

小川先生
早急にお返事いただいてありがとうございました。

早速ですがおくります。
よろしくお願いいたします。


10608 : 小川慶一の回答 (2018-09-30 15:50:28)

受講生 さん:

こんにちは。

理由として考えられることが多すぎます。

ので、いただいた投稿だけでは何とも言えません。

書いたプログラムを送ってください。エクセルファイルごとのほうがよいです。

「業務で使うファイルなので送付はできない」ということでしたら、自分でエクセルファイルを作り、そのファイルのどこかのシートのどこかのセルに「ex(13l)」という文字列を投入し、それを区切り文字「|」で区切って左右に分割しようとするなりの、書いて挫折したマクロも送ってください。
よろしくお願いいたします。


> この講座を作っていただいてありがとうございます!っていうぐらいわかりやすく、何回も見直してます。
>
> 今回の質問は、文字が入った数値ex(13l)(じゅうさんパイプ)を数値のみの(13)にしたい場合うまくinstr関数left関数にしてもうまくできません。
>
> なにが原因かそして改善策をどうしたらいいのかおしえてください。
> ちなみにQRコードを読んだときに区切りとして出てくる”l”です。
> もしかしたら”パイプ”と読まないのかもしれませんがこの区切りをなくし数値のみにしたいと思ってます。
> よろしくお願いいたします。


10601 : 受講生さんのコメント (2018-09-28 22:54:42)

この講座を作っていただいてありがとうございます!っていうぐらいわかりやすく、何回も見直してます。

今回の質問は、文字が入った数値ex(13l)(じゅうさんパイプ)を数値のみの(13)にしたい場合うまくinstr関数left関数にしてもうまくできません。

なにが原因かそして改善策をどうしたらいいのかおしえてください。
ちなみにQRコードを読んだときに区切りとして出てくる”l”です。
もしかしたら”パイプ”と読まないのかもしれませんがこの区切りをなくし数値のみにしたいと思ってます。
よろしくお願いいたします。





10561 : 小川慶一の回答 (2018-09-10 10:08:53)

Matsumotoさん:

> 少ない道具を使いこなす(考えずに体が動く)ことを目指します。

本当に、それが大切です。
そこがしっかりできれば、道具を増やすのは簡単ですよ!運動神経のいい子がどんなスポーツもすぐにそこそこできるようになるのと同じです。



> [9]で何度も練習してからすぐに解いたので、スラスラと回答できました。
> 復習問題は、きちんと理解できたか確認できるので、
> 解いていて楽しいです。
>
> 次々新しい道具を欲しがる前に
> 少ない道具を使いこなす(考えずに体が動く)ことを目指します。
>


10557 : Matsumotoさんのコメント (2018-09-09 11:43:05)

[9]で何度も練習してからすぐに解いたので、スラスラと回答できました。
復習問題は、きちんと理解できたか確認できるので、
解いていて楽しいです。

次々新しい道具を欲しがる前に
少ない道具を使いこなす(考えずに体が動く)ことを目指します。


9248 : 小川慶一の回答 (2017-12-19 16:18:42)

吉川 裕子さん:

コメントありがとうございます。

> 反復して書くことで、わからない⇒理解できた⇒当たり前のことのように、どんどん自分の中に積みあがっていくことを感じております。

ですねー。
地味に、身体に染み込ませるステップが重要だったりします。

> ひとまずどんなマクロもまずは書いてみるというのが自然とできるようになってきました。引き続きよろしくお願いいたします。

こちらもまさに。
講座本編でも、「まずは書いてから考える、まずは実行してから考える」としつこく言っています (^^;

ひきつづきお楽しみください☆


9247 : ガラパゴスタディー吉川の回答 (2017-12-19 16:11:12)

前回動画の復習となりました。
反復して書くことで、わからない⇒理解できた⇒当たり前のことのように、どんどん自分の中に積みあがっていくことを感じております。
ひとまずどんなマクロもまずは書いてみるというのが自然とできるようになってきました。引き続きよろしくお願いいたします。


8896 : 小川慶一の回答 (2017-09-17 11:52:01)

ながのさん:

>どの変数が何を意味しているのかを理解することが大事。

変数名は、見ただけでどういう機能を満たすために作った変数か?が分かる名前にするのが鉄則です。
あとは、同じ問題をくり返し解くことです。

「理解することが大事」と言っている間は、たぶん演習が足りません。


8891 : ながのさんのコメント (2017-09-16 16:09:41)

文字列を見つけることがポイント
/や半角スペースを ”/”、" "で示すことで文字列を加工することができる。
いやぁ〜でも、変数がたくさん出てくるので、どの変数が何を意味しているのかを理解することが大事。


6126 : 小川慶一の回答 (2016-03-26 13:36:33)

受講生 さん:

>私が考えた方法は、置換機能を使って一度区切り文字を"/"に統一してから
>文字の分割処理を行う手順です。先にこれをしてしまえば、分岐処理の手間がなくなります。

そんな感じです。
「区切り文字として全角、半角のスペースが混在している」といったときに、「まずは、全角スペースを半角になおした状態の文字列を作り、あとはそれを処理」とか、そういう使い方よくしますね。

>しかし、もし先生が他の方法で使う手段を念頭に置いていたのでしたら、
>「別の使い道がある」とだけおっしゃってください。
>後日の宿題として考えますから(笑)

いやいや、そうおっしゃらずにw
細かいことのご質問も、どうぞ遠慮無く。本質的な概念みたいなところは説明大変なので「詳しくは発展編へ」と案内することはありますが。


6119 : 受講生さんのコメント (2016-03-25 17:39:32)

先生、relace関数のご紹介ありがとうございます。
さっそく調べて、置換関数だとわかりました。
発展編の内容ということのなので、詳細な質問は控えますが、
私が考えた方法は、置換機能を使って一度区切り文字を"/"に統一してから
文字の分割処理を行う手順です。先にこれをしてしまえば、分岐処理の手間がなくなります。

しかし、もし先生が他の方法で使う手段を念頭に置いていたのでしたら、
「別の使い道がある」とだけおっしゃってください。
後日の宿題として考えますから(笑)
by gooska

>受講生 さん:
>
>あとは、発展編1で登場する Replace 関数を使うというのもありです。
>もう、ご自身で調べても理解できるかと。よかったら、ネット等て調べてみてください。
>


6118 : 小川慶一の回答 (2016-03-25 07:44:43)

受講生 さん:

あとは、発展編1で登場する Replace 関数を使うというのもありです。
もう、ご自身で調べても理解できるかと。よかったら、ネット等て調べてみてください。


6113 : 受講生さんのコメント (2016-03-24 22:50:34)

動画を見ずに一応動くものを作れましたが、
動画と比べてみると、無駄が多いです(;´・ω・)

Sub mondai0093()
    Dim namae
    Dim sei
    Dim gyo
    For gyo = 2 To 11
        namae = Range("B" & gyo).Value
        If InStr(namae, "/") > 0 Then
            sei = InStr(namae, "/")
            Range("C" & gyo).Value = Left(namae, sei - 1)
            Range("D" & gyo).Value = Mid(namae, sei + 1)
        Else
            sei = InStr(namae, " ")
            Range("C" & gyo).Value = Left(namae, sei - 1)
            Range("D" & gyo).Value = Mid(namae, sei + 1)
        End If
    Next
End Sub


"/"で区切る場合と、半角スペースで区切る場合を
分岐処理で繰り返してしまいました。

      sla = InStr(myonam, " ")
        If sla = 0 Then
            sla = InStr(myonam, "/")
        End If
  

のように、変数に 「または」の 意味をもたせてIF文を閉じてしまい、
共通の文字列関数処理として書いてもよかったんですね。

練習が必要です。考える方向はざっくり合っていたと思いますが・・・
by gooska



3730 : 小川慶一の回答 (2015-02-03 22:44:37)

ゲスト さん:

良かったです。しっかりマスターしていただければと思います☆

>これまで練習問題は自力で書けていましたが、内心「If Then Else End Ifってもっと簡素に書けないかな」と思っていたので、
>今回の動画はとても参考になりました☆└(゚∀゚└))((┘゚∀゚)┘


3715 : 佐藤 あゆむさんのコメント (2015-01-31 11:45:59)

これまで練習問題は自力で書けていましたが、内心「If Then Else End Ifってもっと簡素に書けないかな」と思っていたので、
今回の動画はとても参考になりました☆└(゚∀゚└))((┘゚∀゚)┘


1727 : 小川慶一の回答 (2014-07-14 08:40:29)

匿名 さん:

分からなくなったら、適当にいろいろ数値を入れて試してみるのが早いです。
それで慣れてくるとパターンも分かってきて、「どうせこんな感じだろう」とすぐに見当をつけられます。その分、いろいろ試すのにかかる時間も減っていきます。

「エクセルマクロを学びたい人のための頭がよくなるエクセル講座」でもお伝えしているとおりです。
経験をたくさん重ねることが、最終的に発想のスピードをあげます。

「エクセルマクロを学びたい人のための頭がよくなるエクセル講座」
https://online.pc5bai.com/package/index/9


>問題8の駅名で訳が分からなくなったのですが、下記のコードで上手くいきました。ほっ
>やり方を、色々工夫出来る所が楽しいですね。
>Range("I" & gyo).Value = Mid(eki, sen + 1, toho - sen - 1)


1723 : 受講生さんのコメント (2014-07-13 19:29:19)

問題8の駅名で訳が分からなくなったのですが、下記のコードで上手くいきました。ほっ
やり方を、色々工夫出来る所が楽しいですね。
Range("I" & gyo).Value = Mid(eki, sen + 1, toho - sen - 1


270 : ガラパゴスタディー事務局の回答 (2013-09-09 00:00:00)

小俣さん:

> 解説動画での小川さんの書き順やショートカットの使い方もほぼ忠実に再現できてきたなーと、自分の成長が実感できて楽しいです。

上手な人は、手元から違います。というか、手元が変われば、結果は勝手についてきますよ☆


269 : 小俣卓生さんのコメント (2013-09-07 00:00:00)

今回はサクサクとあっという間に書けました。
解説動画での小川さんの書き順やショートカットの使い方もほぼ忠実に再現できてきたなーと、自分の成長が実感できて楽しいです。


268 : ガラパゴスタディー事務局の回答 (2013-09-05 00:00:00)

北嶋さん:

> 前回の問題で苦労したおかげか、今回はあっさりとできました。
> 繰り返し出てくる値を変数として定義することにも慣れてきて、すごくレベルアップしている感覚を味わっています。

ですよねー。そんな感じが伝わってきます☆

> 関数を使っても出来るような処理でしたが、こういう少しの積み重ねが上達につながるはずなので

ですです。
いまは、自転車に乗るのを覚えたばかりのような状態だと思ってください。こういう時期は、歩ける距離でも自転車に乗ってください。そのほうが上達が早いです。


267 : 北嶋浩行さんのコメント (2013-08-02 00:00:00)

前回の問題で苦労したおかげか、今回はあっさりとできました。
繰り返し出てくる値を変数として定義することにも慣れてきて、すごくレベルアップしている感覚を味わっています。
実は仕事でもちょっとしたマクロ(非常に簡単なもの)を書いてみました。
関数を使っても出来るような処理でしたが、こういう少しの積み重ねが上達につながるはずなので、できるだけ実務でマクロを作るようにしていこうと思います。


266 : ガラパゴスタディー事務局の回答 (2013-07-14 00:00:00)

平井さん:

やってみて、結果どうだったでしょう?何かあれば、ぜひ、またお知らせください (^


265 : 平井孝代さんのコメント (2013-07-11 00:00:00)

半角スペースと全角スペースが混在している場合も同じようになるかやってみようと思います!


264 : ガラパゴスタディー事務局の回答 (2013-06-25 00:01:00)

やまださん:

> 条件が満たされなかった場合、Thenの後すぐに[プロシージャ・は]に飛び、[プロシージャ・ろ]は実行されない(注)。
> ということがわかっていなかった。(注)もちろん[プロシージャ・は]に該当する部分が空欄の場合、何も実行されない。

> ※これは、F8を押していくという作業をやったからわかったことです。
> 実は私は、F5で検証していたので、「1行ずつの動きを確認する」という「指さし確認」を怠っていたためこのことに気付かなかったんだと思います(すみません。。)。

↑それが分かっていただければOKです。

基礎編で、二人一組で小人ちゃんの役になったり、マクロを書いた人の役になったりしてワークをやりました。
テストをするときは、あのときの感覚で進めてください。


263 : やまださんのコメント (2013-06-25 00:00:00)

コードAを実行して気づいたことを下記に記載します。

《一言でいうと》
IF ~Then~ EndIfのことがよくわかっていなかった。


《もう少し長めに言うと》
例えば、

If [条件・い] Then
[プロシージャ・ろ]
End If
[プロシージャ・は]

のマクロを実行した際に、条件が満たされなかった場合、Thenの後すぐに[プロシージャ・は]に飛び、[プロシージャ・ろ]は実行されない(注)。

ということがわかっていなかった。(注)もちろん[プロシージャ・は]に該当する部分が空欄の場合、何も実行されない。

※これは、F8を押していくという作業をやったからわかったことです。
実は私は、F5で検証していたので、「1行ずつの動きを確認する」という「指さし確認」を怠っていたためこのことに気付かなかったんだと思います(すみません。。)。


《具体的に今回の問題に当てはめて説明すると》

◆表記が「姓/名」の場合

H = InStr(g, "/")
Range("c" & GYO).Value = Left(g, H - 1)
Range("D" & GYO).Value = Mid(g, H + 1)

が実行される。→Cに「姓」Dに「名」が表示される。

これは、前文の
H = InStr(g, " ")

If H = 0 Then
が実行された際に、(姓名)に" "(半角スペース)が含まれなかったため、H=0となり(条件を満たした場合)、Then以下3行(14,18,19)のプロシージャが実行されたものと考えられる。


◆表記が「姓 名」の場合

H = InStr(g, "/")
Range("c" & GYO).Value = Left(g, H - 1)
Range("D" & GYO).Value = Mid(g, H + 1)

が実行されない。→Cに「姓」Dに「名」が表示されない。


これは、前文の
H = InStr(g, " ")

If H = 0 Then
が実行された際に、(姓名)に" "(半角スペース)が含まれため、H=0ではなくなり(条件を満たさなかった場合)、Then以下3行(14,18,19)のプロシージャが実行されず、ThenのあとすぐにEnd Ifまで飛んでしまったものと考えられます。

以上です。

合ってますでしょうか・・・(なんか書いていて自分の頭の中がこんがらがってきました・・)


262 : ガラパゴスタディー事務局の回答 (2013-06-24 00:00:00)

やまださん:

コードAを小人ちゃんシートで自分でやってみてください。
ステップイン実行(ショートカットキー[F8])で実行して、同じ進行になるか確認しつつ。

それから、その結果気づいたことを、このコメント画面にご記入ください。


261 : やまださんのコメント (2013-06-23 00:00:00)

小川先生、先日の大阪の講座ではお世話になりました。とても楽しかったです。

さて、今回の問題(3)について質問です。

以下に記載したコードAのときはうまくいかず、コードBのときはうまく行きます。理由がよくわからないので教えていただけると幸いです。(両者の違いはendifの位置のみです。)



(コードA)

Sub MYOUJINAMAE3()
                Dim g
                Dim H
        Dim GYO
        For GYO = 2 To 11
                 
         
                g = Range("b" & GYO).Value
                         
         
                H = InStr(g, " ")
                 
                If H = 0 Then
                H = InStr(g, "/")
               
             
                 
                Range("c" & GYO).Value = Left(g, H - 1)
                Range("d" & GYO).Value = Mid(g, H + 1)
         
               End If
         
        Next
         
End Sub


(コードB)
Sub MYOUJINAMAE3()
                Dim g
                Dim H
        Dim GYO
        For GYO = 2 To 11
                 
         
                g = Range("b" & GYO).Value
                         
         
                H = InStr(g, " ")
                 
                If H = 0 Then
                H = InStr(g, "/")
               
            End If
                 
                Range("c" & GYO).Value = Left(g, H - 1)
                Range("d" & GYO).Value = Mid(g, H + 1)
         
                
         
        Next
         
End Sub


260 : ガラパゴスタディー事務局の回答 (2013-05-12 00:01:00)

土田さん:

> 前回を踏まえると今回は楽勝ですね。^^v
> 解説通りのマクロがかけました。

おお、すごい (^^


259 : 土田 信行さんのコメント (2013-05-12 00:00:00)

前回を踏まえると今回は楽勝ですね。^^v
解説通りのマクロがかけました。


258 : ガラパゴスタディー事務局の回答 (2013-04-09 00:00:00)

池本さん:

順調そうで、なにより (^^*

そうですね。慣れると、頭の中で一瞬でコードが浮かぶようになります (^


257 : 池本利恵さんのコメント (2013-04-08 00:00:00)

こんにちは~☆

簡単でした!! 動画をみないで問題3問全部解けました。
いつも最初はとりあえず動くマクロを作ってみてからはじめていますが、今日は問題3だけ、すらすらと頭に浮かんできた変数をかいて解いてみました。1回で成功!2日ぶりにf5で気持ちよくさくっと値が入りました!!

day 10、楽しみにしていま~す☆


256 : ガラパゴスタディー事務局の回答 (2013-02-22 00:00:00)

豊島さん:

まさに、ケースバイケースですね。
同じマクロを実行している最中にも、ちょこまかと画面を移動させることもしばしば。

デュアルディスプレイ環境でテストするときは、もっと気楽ですが。


255 : 豊島 久博さんのコメント (2013-02-21 00:02:00)

2日遅れですが、3日前の条件分岐で引数を定めると言うポイントを理解できたお陰で、スムーズにマクロを書けました。

マクロシートとエクセルシートの画面での位置関係で、今日の場合のようにエクセルシートの書き込む欄が少なければ、縦に並べた方が作業しやすいと思いました。

ケースバイケースだと思いますが、、


731 : ガラパゴスタディー事務局の回答 (2013-02-21 00:01:00)

笹原さん:

「もう一つ」のほうは、異常系の話になるのでどこまでやるかという議論になりますが...。

僕なら、別に区切り文字候補リストを作っておいて、それと比較するロジックにしたいです。
(一般ユーザーにどの文字を処理対象としているか見せるという意味でも)

区切り文字候補リストの中に見つからなかったら、 input でユーザーに問い合わせして、そこで入力されたものもリストに追加。
skip処理することになった場合は、データ記入用の表のどこかにその旨リマークを記入。
今の目標は楽しく動画を浴びるように見ること。
?と思った部分は何回も再生しています。
後は時間と格闘しながら書くこと。
とにかくキー操作に慣れること。
必ずサンプルデータは開いてマクロは動かしています!


254 : ガラパゴスタディー事務局の回答 (2013-02-21 00:00:00)

匿名さん:

こんにちは。まず、ひとつめから。

あえて言うなら、split関数はコストかかりそうだから、演算結果を変数に格納したいかな、というくらい。

あと、僕なら、Cellsの戻り値はオブジェクトなので、.Valueまで書きますね。

Sub 問題1から3_ogawa()    Dim i As Long, n As String, sp() As String      For i = 2 To Range("B1").CurrentRegion.Rows.Count        If InStr(Cells(i, 2).Value, "/") > 0 Then            n = "/"        Else            n = " "        End If        sp = Split(Cells(i, "B").Value, n)        Cells(i, "C").Value = sp(0)        Cells(i, "D").Value = sp(1)    Next iEnd Sub


253 : 受講生さんのコメント (2013-02-20 00:01:00)

もう一つ 色んなパターンを考えてみました。区切り文字が無いパターンや ユーザーの入力ミスに対応して 誤作動しないように。
細かなところの 修正をお願いします。

Public Sub 問題()
Dim i As Long, n As String
 
    For i = 2 To Range("B1").CurrentRegion.Rows.Count
        With Cells(i, 2)
            Select Case True
                Case .Value Like "*/*"
                    n = "/"
                Case .Value Like "* *"
                    n = " "
                Case .Value Like "* *"
                    n = " "
                Case Else
                    n = InputBox("区切り文字を入力してください")
            End Select
                 
            If n <> "" And InStr(.Value, n) > 0 Then
                .Offset(0, 1) = Split(.Value, n)(0)
                .Offset(0, 2) = Split(.Value, n)(1)
            End If
        End With
    Next i
End Sub


252 : 受講生さんのコメント (2013-02-20 00:00:00)

今回の問題は、必ず役に立つものなので 真面目に取り組んでみました。 問題提供の小川先生に 感謝します。 細かなところの手直しをお願いしたく、投稿させていただきます。
一つ目は 問題1、問題2、問題3に共通で使用。

Sub 問題1から3()
Dim i As Long, n As String
 
    For i = 2 To Range("B1").CurrentRegion.Rows.Count
        If InStr(Cells(i, 2), "/") > 0 Then
            n = "/"
        Else
            n = " "
        End If
         
        Cells(i, "C") = Split(Cells(i, "B"), n)(0)
        Cells(i, "D") = Split(Cells(i, "B"), n)(1)
 
    Next i
End Sub


251 : ガラパゴスタディー事務局の回答 (2013-01-29 00:00:00)

山根さん:

冗長な計算をしなくて済む、というのが変数を活用することのメリットのひとつですね。

長い式を何度も書いているときには(?)と思うようになるとよいかと思います。


250 : 山根信行さんのコメント (2013-01-28 00:00:00)

しまった~
解けたことは解けました。

Instrの返す値を利用するのはできたんですが、「instrの返す値で変数の中身を書き換える」のを忘れてました。
動画見て「そうだった~」ってなりました。
悔しいですね。

変数を使ってスッキリと読みやすいコードにした方がいいんですね。
他の方のを見ると結果は同じでも随分と書いてるコードが異なり勉強になります。

Sub Q3()
    Dim i As Long
     
    For i = 2 To 11
        If InStr(Range("B" & i).Value, "/") > 0 Then
            Range("C" & i).Value = Left(Range("B" & i), InStr(Range("B" & i).Value, "/") - 1)
            Range("D" & i).Value = Mid(Range("B" & i), InStr(Range("B" & i).Value, "/") + 1)
        ElseIf InStr(Range("B" & i).Value, " ") > 0 Then
            Range("C" & i).Value = Left(Range("B" & i), InStr(Range("B" & i).Value, " ") - 1)
            Range("D" & i).Value = Mid(Range("B" & i), InStr(Range("B" & i).Value, " ") + 1)
         
        End If
    Next
End Sub


249 : 小川慶一の回答 (2012-11-25 00:02:00)

屋敷さん:

> 今回は1~3ともに問題なく解けました。
> 単純に嬉しいです。

ですよねー。分かります!

着実にスキルアップされていると思います。
おめでとうございます ヾ(´ー`)ノ

ひきつづき、お楽しみください!!


248 : 屋代 有俊さんのコメント (2012-11-25 00:01:00)

前回の問題で苦労し、何度も復習したので、
今回は1~3ともに問題なく解けました。
単純に嬉しいです。


247 : ガラパゴスタディー事務局の回答 (2012-11-25 00:00:00)

佐藤さん:

> ただ、動画のようにサクサクとは作れない
> 何度かやり直して作成する感じです。

最初は、そんなものです。サクサクできるほうかどうかしていますので、ご安心を(w

変数は、ネーミングがポイント。
名前を見ただけで、どういう趣旨で作ったのか分かるような名前にするよう心がけてください。
それだけでも、だいぶ変数名間違いは避けられます。


246 : 佐藤 尚子さんのコメント (2012-11-23 00:00:00)

前回習った内容を元にできました~!
思うように動くと嬉しいですね。
ただ、動画のようにサクサクとは作れない
何度かやり直して作成する感じです。
良く自分で作った変数の名前を間違えます・・・。


245 : 竹端博希さんのコメント (2012-10-29 00:01:00)

if文がいまいちうまく作れないですね。問題を解くことはできるのですが、ついつい、”else”の構文も作ってしまい、無駄な構文を書いている感じがします。動画を見直して、変な癖を直します。


244 : 加藤美智子さんのコメント (2012-10-29 00:00:00)

今回は動画No.008での内容が印象的だったので、問題だけで簡単に出来ました。動画と同じやり方です。\(^o^)/


243 : 久武 美香さんのコメント (2012-10-19 00:00:00)

問題1,2はすんなりできました。

問題3は、前回もやったのにやっぱりまだベタな書き方をしてしまいました。

↓この発想に至らないんですよね…

sla = InStr(namae, " ")
If sla = 0 Then
sla = InStr(namae, "/")
End If



Sub mondai3()
Dim namae
Dim sla
Dim spe
Dim gyo
For gyo = 2 To 11
namae = Range("B" & gyo).Value
sla = InStr(namae, "/")
spe = InStr(namae, " ")
If InStr(namae, "/") > 0 Then
Range("C" & gyo).Value = Left(namae, sla - 1)
Range("D" & gyo).Value = Mid(namae, sla + 1)
Else
Range("C" & gyo).Value = Left(namae, spe - 1)
Range("D" & gyo).Value = Mid(namae, spe + 1)
End If

Next
End Su


242 : 有家 健司さんのコメント (2012-10-15 00:00:00)

横長より縦長の(できるだけ変数を使う)ほうがいいんですね。
以後、そうします。ありがとうございます。

Sub mondai1()
Dim a
For a = 2 To 11
Dim namae
Dim slash
namae = Range("B" & a).Value
slash = InStr(namae, "/")

Range("C" & a).Value = Left(namae, slash - 1)
Range("D" & a).Value = Mid(namae, slash + 1, 100)
Next
End Sub

Sub mondai2()
Dim a
For a = 2 To 11
Dim namae
Dim space
namae = Range("B" & a).Value
space = InStr(namae, " ")

Range("C" & a).Value = Left(namae, space - 1)
Range("D" & a).Value = Mid(namae, space + 1, 100)
Next
End Sub

Sub mondai3()
Dim a
For a = 2 To 11
Dim namae
Dim slash
Dim space
namae = Range("B" & a).Value
slash = InStr(namae, "/")
space = InStr(namae, " ")

If InStr(namae, " ") = 0 Then
Range("C" & a).Value = Left(namae, slash - 1)
Range("D" & a).Value = Mid(namae, slash + 1, 100)
Else
Range("C" & a).Value = Left(namae, space - 1)
Range("D" & a).Value = Mid(namae, space + 1, 100)
End If
Next
End Su


1251 : 小川慶一の回答 (2012-09-04 00:15:00)

こんばんは。

そうですね。実際、基礎講座レベルの道具しか使わない、と決めると、
やれることも限られていますし、単純です。

ひきつづき、お楽しみください!!


1250 : 受講生さんのコメント (2012-09-03 17:35:00)

No.08と全く同じだと、直ぐに気づけたので問題なく出来ました。



住所と氏名が全く同じように処理できるところが、面白いですね。

考え方に慣れてくると、本当に単純ですね。


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 If文とForNext構文を組み合わせる
    【動画1】 If文とForNext構文を組み合わせる 未習得
  2. 【動画2】 複数条件を組み合わせた条件分岐
    【動画2】 複数条件を組み合わせた条件分岐 未習得
  3. 【動画3】 ElseIfを使った条件分岐
    【動画3】 ElseIfを使った条件分岐 未習得
  4. 【動画4】 出現回数を数える。CountIf関数がやっていることをマクロで書くと?
    【動画4】 出現回数を数える。CountIf関数がやっていることをマクロで書くと? 未習得
  5. 【動画5】 条件に一致するデータを別表に転記する。AutoFilterより便利な条件抽出マクロ。
    【動画5】 条件に一致するデータを別表に転記する。AutoFilterより便利な条件抽出マクロ。 未習得
  6. 【動画6】 条件に一致するデータを別シートに転記する
    【動画6】 条件に一致するデータを別シートに転記する 未習得
  7. 【動画7】 とびとびに存在するデータを拾って加工する
    【動画7】 とびとびに存在するデータを拾って加工する 未習得
  8. 【動画8】 文字列を加工してデータ転記する(その1)
    【動画8】 文字列を加工してデータ転記する(その1) 未習得
  9. 【動画9】 文字列を加工してデータ転記する(その2)
    【動画9】 文字列を加工してデータ転記する(その2) 未習得
  10. 【動画10】 文字列を加工してデータ転記する(その3)
    【動画10】 文字列を加工してデータ転記する(その3) 未習得
  11. 【動画11】 勘定項目ごとに合計額を算出する。SumIf関数がやっていることをマクロで書くと?
    【動画11】 勘定項目ごとに合計額を算出する。SumIf関数がやっていることをマクロで書くと? 未習得
  12. 【動画12】 残業時間がいちばん多い従業員の情報を出力する。Max関数、Min関数より便利なマクロ
    【動画12】 残業時間がいちばん多い従業員の情報を出力する。Max関数、Min関数より便利なマクロ 未習得
  13. 【動画13】 複数の表の間でのマッチング。VLookUp関数がやっていることをマクロで書くと?
    【動画13】 複数の表の間でのマッチング。VLookUp関数がやっていることをマクロで書くと? 未習得
  14. 【動画14】 文字列を様々に解析して条件分岐
    【動画14】 文字列を様々に解析して条件分岐 未習得
  15. 【動画15】 複数の記号に挟まれた文字列を取り出す
    【動画15】 複数の記号に挟まれた文字列を取り出す 未習得
  16. 【動画16】 各資料ごとに1番からの番号を割り振る。AutoFill機能より便利なマクロ
    【動画16】 各資料ごとに1番からの番号を割り振る。AutoFill機能より便利なマクロ 未習得
  17. 【動画17】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その1)
    【動画17】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その1) 未習得
  18. 【動画18】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その2)
    【動画18】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その2) 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ