
Instr関数をつかって「" "」で、区切りの「スペース」が何文字目にあるのかも調べられるというのがポイント。
[1]Instr関数をつかって区切りの字(ここではスラッシュや半角スペース)が何文字目にあるかを調べる変数を使う
[2]区切りの字の前か後かを変数-1、変数+1であらわす
[3]区切りの字が複数ある場合はInstr関数が区切りの字の有無を判別することを利用してIf文を使う
の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
次回からは、相談時は、実際に作ったコードをまるまる貼り付けてください。
最初の行は 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
>
>
英語を使わない理由がわかりました。その他についてもいただいたアドバイスを参考にいたします。
小川慶一さん:
> 受講生 さん:
>
> 次回からは、相談時は、実際に作ったコードをまるまる貼り付けてください。
> 最初の行は 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
> >
> >
お返事ありがとうございます。
特にインデントについては、遠回りなようで、最終的に近道です。
ひきつづきよろしくお願いいたします。
> お世話になります。ご回答ありがとうございました。
>
> 英語を使わない理由がわかりました。その他についてもいただいたアドバイスを参考にいたします。
>
> 小川慶一さん:
>
> > 受講生 さん:
> >
> > 次回からは、相談時は、実際に作ったコードをまるまる貼り付けてください。
> > 最初の行は 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
> > >
> > >
以下の件かなり参考になりました。
仕事上、ばれてしまうことがあるので朝、名前変数等急いで加工してしまいました。(まあそれだけではないですがまだまだ勉強の足りなさを感じております。)
もう一度書かれていた件は振り返り学習をしようと思います。
まだまだ発展まで行きませんが、確実に勉強していきたいと思っております。
丁寧な対応ありがとうございました。
その後どうでしょうか。お役に立てればと思っています。
>まあそれだけではないですがまだまだ勉強の足りなさを感じております
作法は大切ですよ。
慌てて加工したプログラムだとしても、型に従わなかったことは一目瞭然です。
> 小川先生
>
> 以下の件かなり参考になりました。
> 仕事上、ばれてしまうことがあるので朝、名前変数等急いで加工してしまいました。(まあそれだけではないですがまだまだ勉強の足りなさを感じております。)
>
> もう一度書かれていた件は振り返り学習をしようと思います。
> まだまだ発展まで行きませんが、確実に勉強していきたいと思っております。
>
> 丁寧な対応ありがとうございました。
今回の質問は、文字が入った数値ex(13l)(じゅうさんパイプ)を数値のみの(13)にしたい場合うまくinstr関数left関数にしてもうまくできません。
なにが原因かそして改善策をどうしたらいいのかおしえてください。
ちなみにQRコードを読んだときに区切りとして出てくる”l”です。
もしかしたら”パイプ”と読まないのかもしれませんがこの区切りをなくし数値のみにしたいと思ってます。
よろしくお願いいたします。
こんにちは。
理由として考えられることが多すぎます。
ので、いただいた投稿だけでは何とも言えません。
書いたプログラムを送ってください。エクセルファイルごとのほうがよいです。
「業務で使うファイルなので送付はできない」ということでしたら、自分でエクセルファイルを作り、そのファイルのどこかのシートのどこかのセルに「ex(13l)」という文字列を投入し、それを区切り文字「|」で区切って左右に分割しようとするなりの、書いて挫折したマクロも送ってください。
よろしくお願いいたします。
> この講座を作っていただいてありがとうございます!っていうぐらいわかりやすく、何回も見直してます。
>
> 今回の質問は、文字が入った数値ex(13l)(じゅうさんパイプ)を数値のみの(13)にしたい場合うまくinstr関数left関数にしてもうまくできません。
>
> なにが原因かそして改善策をどうしたらいいのかおしえてください。
> ちなみにQRコードを読んだときに区切りとして出てくる”l”です。
> もしかしたら”パイプ”と読まないのかもしれませんがこの区切りをなくし数値のみにしたいと思ってます。
> よろしくお願いいたします。
早急にお返事いただいてありがとうございました。
早速ですがおくります。
よろしくお願いいたします。
最初の投稿でファイル受領できています。
エラーがでてしまいましたか。それはすいません。システム担当に調査させます。
ファイル内容確認のうえ、またお返事差し上げますね。
よろしくお願いいたします。
> 小川先生
> 早急にお返事いただいてありがとうございました。
>
> 早速ですがおくります。
> よろしくお願いいたします。
>
添削を返送します。
このエクセルファイル、このまま講座用資料として公開させてもらっても良いでしょうか?
'[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章の「変数」以降を復習してください。
とりいそぎ。
> 小川先生
> 早急にお返事いただいてありがとうございました。
>
> 早速ですがおくります。
> よろしくお願いいたします。
>
復習問題は、きちんと理解できたか確認できるので、
解いていて楽しいです。
次々新しい道具を欲しがる前に
少ない道具を使いこなす(考えずに体が動く)ことを目指します。
> 少ない道具を使いこなす(考えずに体が動く)ことを目指します。
↑
本当に、それが大切です。
そこがしっかりできれば、道具を増やすのは簡単ですよ!運動神経のいい子がどんなスポーツもすぐにそこそこできるようになるのと同じです。
> [9]で何度も練習してからすぐに解いたので、スラスラと回答できました。
> 復習問題は、きちんと理解できたか確認できるので、
> 解いていて楽しいです。
>
> 次々新しい道具を欲しがる前に
> 少ない道具を使いこなす(考えずに体が動く)ことを目指します。
>
反復して書くことで、わからない⇒理解できた⇒当たり前のことのように、どんどん自分の中に積みあがっていくことを感じております。
ひとまずどんなマクロもまずは書いてみるというのが自然とできるようになってきました。引き続きよろしくお願いいたします。
コメントありがとうございます。
> 反復して書くことで、わからない⇒理解できた⇒当たり前のことのように、どんどん自分の中に積みあがっていくことを感じております。
ですねー。
地味に、身体に染み込ませるステップが重要だったりします。
> ひとまずどんなマクロもまずは書いてみるというのが自然とできるようになってきました。引き続きよろしくお願いいたします。
こちらもまさに。
講座本編でも、「まずは書いてから考える、まずは実行してから考える」としつこく言っています (^^;
ひきつづきお楽しみください☆
/や半角スペースを ”/”、" "で示すことで文字列を加工することができる。
いやぁ〜でも、変数がたくさん出てくるので、どの変数が何を意味しているのかを理解することが大事。
>どの変数が何を意味しているのかを理解することが大事。
変数名は、見ただけでどういう機能を満たすために作った変数か?が分かる名前にするのが鉄則です。
あとは、同じ問題をくり返し解くことです。
「理解することが大事」と言っている間は、たぶん演習が足りません。
もしかしたら多くの方から同じような
質問が来ているかもしれませんが、講座の効果的な
復習の仕方を教えて頂きたく存じます。
学んだ内容がすぐに頭から抜けてしまう
事が多いので何かいい方法がございましたら
ご教授頂きたく存じます。
あと、ご自身でどんな努力をされているのか?をまずはお知らせください。
> お世話になります。
>
> もしかしたら多くの方から同じような
> 質問が来ているかもしれませんが、講座の効果的な
> 復習の仕方を教えて頂きたく存じます。
>
> 学んだ内容がすぐに頭から抜けてしまう
> 事が多いので何かいい方法がございましたら
> ご教授頂きたく存じます。
動画と比べてみると、無駄が多いです(;´・ω・)
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
あとは、発展編1で登場する Replace 関数を使うというのもありです。
もう、ご自身で調べても理解できるかと。よかったら、ネット等て調べてみてください。
さっそく調べて、置換関数だとわかりました。
発展編の内容ということのなので、詳細な質問は控えますが、
私が考えた方法は、置換機能を使って一度区切り文字を"/"に統一してから
文字の分割処理を行う手順です。先にこれをしてしまえば、分岐処理の手間がなくなります。
しかし、もし先生が他の方法で使う手段を念頭に置いていたのでしたら、
「別の使い道がある」とだけおっしゃってください。
後日の宿題として考えますから(笑)
by gooska
>受講生 さん:
>
>あとは、発展編1で登場する Replace 関数を使うというのもありです。
>もう、ご自身で調べても理解できるかと。よかったら、ネット等て調べてみてください。
>
>私が考えた方法は、置換機能を使って一度区切り文字を"/"に統一してから
>文字の分割処理を行う手順です。先にこれをしてしまえば、分岐処理の手間がなくなります。
そんな感じです。
「区切り文字として全角、半角のスペースが混在している」といったときに、「まずは、全角スペースを半角になおした状態の文字列を作り、あとはそれを処理」とか、そういう使い方よくしますね。
>しかし、もし先生が他の方法で使う手段を念頭に置いていたのでしたら、
>「別の使い道がある」とだけおっしゃってください。
>後日の宿題として考えますから(笑)
いやいや、そうおっしゃらずにw
細かいことのご質問も、どうぞ遠慮無く。本質的な概念みたいなところは説明大変なので「詳しくは発展編へ」と案内することはありますが。
今回の動画はとても参考になりました☆└(゚∀゚└))((┘゚∀゚)┘
良かったです。しっかりマスターしていただければと思います☆
>これまで練習問題は自力で書けていましたが、内心「If Then Else End Ifってもっと簡素に書けないかな」と思っていたので、
>今回の動画はとても参考になりました☆└(゚∀゚└))((┘゚∀゚)┘
やり方を、色々工夫出来る所が楽しいですね。
Range("I" & gyo).Value = Mid(eki, sen + 1, toho - sen - 1)
分からなくなったら、適当にいろいろ数値を入れて試してみるのが早いです。
それで慣れてくるとパターンも分かってきて、「どうせこんな感じだろう」とすぐに見当をつけられます。その分、いろいろ試すのにかかる時間も減っていきます。
「エクセルマクロを学びたい人のための頭がよくなるエクセル講座」でもお伝えしているとおりです。
経験をたくさん重ねることが、最終的に発想のスピードをあげます。
「エクセルマクロを学びたい人のための頭がよくなるエクセル講座」
https://forum.pc5bai.com/lesson/course/9
>問題8の駅名で訳が分からなくなったのですが、下記のコードで上手くいきました。ほっ
>やり方を、色々工夫出来る所が楽しいですね。
>Range("I" & gyo).Value = Mid(eki, sen + 1, toho - sen - 1)