質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1809閲覧

【VBA】入力をした順番通りに文字が反映されない

yuuy

総合スコア14

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/04/26 04:37

編集2017/04/27 08:25

現在業務で使うエクセルの表の分類・入力を楽にするために
「セルG12~G300orI12~I300のどれか一つに『携帯ショップスタッフor本社事務or審査事務』などの求人名を入力すると、H12~300orJ12~300の対応するセルに『時給1000円~1500円or月給16~18万円or月収23万』の給与額が入力される(例えばG12に入力をしたらH12に反映される)」というものを作成しています。

以下のコードを作成したのですが、入力をした求人名の順番通りに給与名が反映されず困っております。

Sub 求人内容ごとによる給与の振り分け非正規雇用() Dim v As Variant Dim i As Integer For i = 12 To 300 If Cells(i, 7) <> "" Then v = Application.Find("携帯ショップスタッフ", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = "時給1000円~1500円" End If v = Application.Find("本社事務", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "月給16~18万円" End If v = Application.Find("本社事務(オペレーター職)", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "月給16~18万円" End If v = Application.Find("秘書", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "月給16~18万円" End If v = Application.Find("業務部", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "月給16~18万円" End If v = Application.Find("コールセンター", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "月給16~18万円" End If v = Application.Find("インバウンド営業業務", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "月給16~18万円" End If v = Application.Find("会社名1", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "月給16~18万円" End If v = Application.Find("内部監査員", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "月給16~18万円" End If v = Application.Find("SHOP販売", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "月給16~18万円" End If v = Application.Find("CCC営業アシスタント", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "時給1100円" End If v = Application.Find("CCC庶務", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "時給1100円" End If v = Application.Find("審査事務(新卒)", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "時給1000円" End If v = Application.Find("審査事務(中途)", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "時給1100円" End If v = Application.Find("会社名2", Cells(i, 7)) If Not IsError(v) Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "時給1000円" End If End If Next End Sub Sub 求人内容ごとによる給与の振り分け正規雇用() Dim v As Variant Dim i As Integer For i = 12 To 300 If Cells(i, 9) <> "" Then v = Application.Find("新規開拓営業", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = "月給215000円" End If v = Application.Find("内部監査員", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給215000円" End If v = Application.Find("管理職", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給215000円" End If v = Application.Find("SHOP販売業務", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給215000円" End If v = Application.Find("インバウンド営業業務", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給215000円" End If v = Application.Find("データマイニング部", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給175000円" End If v = Application.Find("人事部", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給175000円" End If v = Application.Find("秘書", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給175000円" End If v = Application.Find("業務部", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給175000円" End If v = Application.Find("コールセンター", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給175000円" End If v = Application.Find("審査事務(新卒)", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給175000円" End If v = Application.Find("審査事務(中途)", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給205000円" End If v = Application.Find("CCC貿易業務及び通訳", Cells(i, 9)) If Not IsError(v) Then Cells(i, 10).Value = Cells(i, 10).Value & vbLf & "月給24~36万円" End If End If Next End Sub

イメージ説明

この画像の、13の行が正しい並びなのですが、どうしても14の行の並びになってしまいます。数字の大小?の順に勝手に並ぶようになっているのでしょうか。
よろしくお願いします。

【追記 ttyp03さんの回答を反映したコードになります】

Sub 求人内容ごとによる給与の振り分け非正規雇用() Dim v As Variant Dim i As Integer For i = 12 To 300 If InStr(Cells(i, 7), "携帯ショップスタッフ") > 0 Then Cells(i, 8).Value = "時給1000円~1500円" End If If InStr(Cells(i, 7), "本社事務") > 0 Then Cells(i, 8).Value = "月給16~18万円" End If If InStr(Cells(i, 7), "CCC庶務") > 0 Then Cells(i, 8).Value = "時給1100円" End If Next End Sub

求人名を1つ入力し場合は問題なく給与が反映されます。
(本社事務→月給16~18万円と反映されています)

二つ以上入力しますと、うまく反映されません。(本社事務→月給16~18万円、携帯ショップスタッフ→"時給1000円~1500円と反映されるのが正しいです)
イメージ説明
こちらも同じく
。(本社事務→月給16~18万円
、携帯ショップスタッフ→"時給1000円~1500円、CCC庶務→時給1100円と反映されるのが正しいです)
イメージ説明

【追記2】

Sub 求人内容ごとによる給与の振り分け非正規雇用() Dim v As Variant Dim i As Integer For i = 12 To 300 If InStr(Cells(i, 7), "携帯ショップスタッフ") > 0 Then Cells(i, 8).Value = "時給1000円~1500円" End If If InStr(Cells(i, 7), "本社事務") > 0 Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "月給16~18万円" End If If InStr(Cells(i, 7), "CCC庶務") > 0 Then Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "時給1100円" End If Next End Sub

このように前後してしまいます。(本社事務→月給16~18万円
、携帯ショップスタッフ→"時給1000円~1500円、CCC庶務→時給1100円と反映されるのが正しいです)
イメージ説明

【追記】
ベストアンサーの方のコードを修正したものです

Sub 求人内容ごとによる給与の振り分け非正規雇用() Dim i As Integer For i = 12 To 300 jobs = Split(Cells(i, 7), vbLf) pays = "" For Each job In jobs Select Case job Case "携帯ショップスタッフ" pay = "時給1000円~1500円" Case "本社事務" pay = "月給16~18万円" Case "CCC営業アシスタント" pay = "時給1100円" pay = "" End Select If pay <> "" And pays <> "" Then pays = pays & vbLf End If pays = pays & pay Next Cells(i, 8).Value = pays Next End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

恐らく文字列の検索にFindを使っているのが原因ではないかと思います。
InStrという関数があるので、置き換えてみてください。

VBA

1If InStr(Cells(i, 7), "携帯ショップスタッフ") > 0 Then 2 Cells(i, 8).Value = "時給1000円~1500円" 3End If

コード追加

VBA

1Sub 求人内容ごとによる給与の振り分け非正規雇用() 2 Dim i As Integer 3 For i = 12 To 300 4 jobs = Split(Cells(i,7), vbLf) 5 pays = "" 6 For Each job in jobs 7 Select Case job 8 case "携帯ショップスタッフ" 9 pay = "時給1000円~1500円" 10 case "本社事務" 11 pay = "月給16~18万円" 12 case "CCC庶務" 13 pay = "時給1100円" 14 else 15 pay = "" 16 End Select 17 If pay <> "" And pays <> "" Then 18 pays = pays & vbLf 19 End If 20 pays = pays & pay 21 Next 22 Cells(i, 8).Value = pays 23 Next 24End Sub 25

投稿2017/04/26 05:16

編集2017/04/26 07:40
ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuy

2017/04/26 07:09

ありがとうございます。 そちらのコードを反映したのですが、 一つ以上反映させるとうまく表示されないです。 追記の方に詳しくありますので見て頂けないでしょうか。
ttyp03

2017/04/26 07:11

2つ目以降は、元のコードにあるように、連結していかないといけないのでは。 Cells(i, 8).Value = Cells(i, 8).Value & vbLf & "月給16~18万円"
yuuy

2017/04/26 07:26

ありがとうございます。 連結をしたのですが、最初の時と同じく給与が前後してしまいました。 何度もすみません 追記の方に詳しくあります
ttyp03

2017/04/26 07:31

あぁ、すみません。 今理解しました。 入力されている職種の順と、If文の順は一緒ではないのですね。 入力する方は自由入力と…。 となると大幅な修正が必要になりますね。 やり方としては、 1.セル文字列を改行コードで分割 2.分割した文字列ごとに比較 という風になります。 時間があればコードを書いてみますが、ご自分でもチャレンジしてみてください。
ttyp03

2017/04/26 07:41

勢いで書いてみましたので、コード追加しました。 確認はしていませんので、問題あれば修正してください。
yuuy

2017/04/27 08:18

追加のコードを修正しましたところ、解決しました。 ありがとうございました。
guest

0

処理の流れがよくないですね

携帯ショップスタッフ → 本社事務 という入力順ならうまくいきませんか?

携帯ショップスタッフ の "月給16~18万円" の代入処理が最初にあるので、どうやっても最初に "月給16~18万円" が入ってしまいます

入力順にしたいのであれば、私なら

1)入力した内容を分解してリストにする
2)リストの順に給与文字列を足していく

という手順を考えます

(サンプル)

1)はこんな感じ

Dim myArray() As String myArray = Split( Cells(i, 7).Value, vbLf ) '改行で分解する

2)はこんな感じ

Dim p Dim 全給与 Dim 個別給与 全給与 = "" For p = 0 To Ubound(myArray) 'myArrayの分割個数でループ If Len(全給与)>0 Then 全給与 = 全給与 & vbLf '2個以上の処理だけ改行を挟む If myArray(p) == "携帯ショップスタッフ" Then 個別給与 = "時給1000円~1500円" Else If myArray(p) == "本社事務" Then 個別給与 = "月給16~18万円" ・・・ End If 全給与 = 全給与 & 個別給与 'ここで文字列を足していく Next Cells(i, 8).Value = 全給与 '完成した中身を出力する

以上ご参考まで

投稿2017/04/26 07:33

takito

総合スコア3111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuy

2017/04/27 08:19

ありがとうございます。 今後の参考にします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問