請求書(sheet21)に税率(10又は8)を表示したく、添付したコードを作成したのですが作動しません。また、ディバックも表示されず、原因がわかりません。作成したコードは、Sheet21のB16~B23セルに商品コード100~1000及びSK01~SK200から商品名に応じた8個の商品コードを入力し、N16~N23セルに、100~1000までは「10」を SK01~SK200までは「8」を表示すると思ったのですが、素人では無理でした。
Sub 消費税率判定()
Dim n As Long
Dim Sh21 As Worksheet
Dim i As Integer
Set Sh21 = Worksheets("b16:N23")
n = WorkSheetFanction("sh21").CountIf(Range("B16:N23"), "<>")
For i = 100 To 1000
Next
If Sh21.Range("B16:B23").Value = i Then
Range("N16:N23").Value = 10
Else
Range("N16:N23").Value = 8
MegBox ("税率は正しいですか")
End If
End Sub
No.6ベストアンサー
- 回答日時:
消費税を算出する処理にセル情報は無関係なので別関数にしましょう。
また、100未満、1000超、1未満、200超、数値でない可能性を考慮し、エラーハンドリングをしましょう。
Option Explicit
'
' 消費税エリアを処理します。
'
Public Sub 消費税率判定()
On Error GoTo Exception
Dim sheet As Worksheet
Dim itemCodeRanges As Range
Dim itemCodeRange As Range
Set sheet = Worksheets("請求書")
Set itemCodeRanges = sheet.Range("B16:B23")
' 消費税列をクリア
itemCodeRanges.Offset(, 12).Value = vbEmpty
' 消費税を設定
For Each itemCodeRange In itemCodeRanges
itemCodeRange.Offset(, 12).Value = getTax(itemCodeRange.Value)
Next
Call MsgBox("税率は正しいですか")
Exit Sub
Exception:
Call MsgBox(Err.Number & vbCrLf & Err.Description, vbOKOnly + vbCritical, "エラー")
End Sub
'
' 消費税を求める。
' @param itemCode 商品コード。
' @return 消費税。
'
Private Function getTax(itemCode As String) As Long
On Error GoTo Exception
Const ReducedTaxRateItemPrefix As String = "sk"
' 消費税範囲グループ
Dim taxGroups(1) As Variant
taxGroups(0) = Array(100, 1000, 10)
taxGroups(1) = Array(1, 200, 8)
Dim targetItemCode As String
targetItemCode = LCase(itemCode)
' 消費税範囲を特定
Dim tax() As Variant
If InStr(targetItemCode, ReducedTaxRateItemPrefix) = 0 Then
tax = taxGroups(0)
Else
tax = taxGroups(1)
End If
' 消費税の決定
Dim itemCodeNumber As Long
itemCodeNumber = CLng(Replace(targetItemCode, ReducedTaxRateItemPrefix, ""))
If tax(0) <= itemCodeNumber And itemCodeNumber <= tax(1) Then
getTax = tax(2)
Exit Function
End If
Call Err.Raise(1000)
Exit Function
Exception:
Call Err.Raise(Err.Number, Err.Source, "消費税算出できませんでした。" & vbCrLf & Err.Description, Err.HelpFile, Err.HelpContext)
End Function
No.10
- 回答日時:
なるほど、失礼しました。
Qchan1962様のおっしゃる通りですね。
では、getTax()に渡す商品コードを得ることができないなら、処理を終わらすなどすれば良さそうですね。
質問者様の全体的な処理の流れが分かりませんが、入力された行ずつに何かを処理しているなら、そこにgetTax()を混ぜ込んで処理することでも可能でしょう。
有難うございます。確かに一度ご入力した行の商品コードを消去した場合、
税率セルの数字はそのまま表示されたままです。No8でご返答しました、
「消費税率判定」ボタンで消去できますが、ご指導の「入力された行ずつに何かを処理しているなら、そこにgetTax()を混ぜ込んで処理する」こともやってみたいと思います。
No.7
- 回答日時:
ご質問の回答ではありませんが
本来は、請求書に直接入力を行って処理するのはどうなのかなと思います
出来るだけ元データ(作成するためのデータ)は、一元化するのが良いと思います。受注ー>納品ー>請求 みたいに1つ前のデータで作られる形
と考えると受注データを入力、納品データを操作して請求書を作る流れになるかと・・
なので、商品一覧表を基軸に考えた方が品番はもちろん品名や単価A・B・C税率など操作し易くなると思いました。
他にも顧客一覧(情報)などが必要ですし、(実績)蓄積データも必要かと
そう考えると基幹業務をVBAで作成するには、少しスキルが必要になるのかなと思いました。
この回答に逆行するような回答ですが、
B列入力時に出力してしまう と言う方法も考えられます。
(私的には比較的よく使います(処理速度をごまかす為)受注入力などで使えると思います)
一応、コードです。対象のシートモジュールに記載しますが
すでにWorksheet_Changeイベントを使われている場合は使われている
Worksheet_Change内に組み込む必要があります。
(サンプルなので少しやっつけ感ありますが添削してくださいね)
当然あるであろう値の削除、選択範囲に入力していくような手順にも
取り合えず対応してみました。(該当品番以外を入力するとメッセージ出力後、元の値に戻ります)
Option Explicit
Dim flag As Boolean
Const iKey As String = "sk"
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
flag = False
If Intersect(Target, Range("B16:B23")) Is Nothing Then Exit Sub
Application.EnableEvents = False
If Target.Count > 1 Then
For Each r In Selection
Call process1(r)
Next
Else
Call process1(Target)
End If
If flag = False Then
MsgBox ("登録品番では有りません")
Application.Undo
End If
Application.EnableEvents = True
End Sub
Sub process1(Target As Range)
With Target
If .Value = "" Then .Offset(, 12).Value = "": flag = True: Exit Sub
If InStr(.Value, iKey) = 0 Then
If .Value >= 100 And .Value <= 1000 Then .Offset(, 12).Value = 10: flag = True
Else
If CInt(Split(.Value, iKey)(1)) >= 1 And CInt(Split(.Value, iKey)(1)) <= 200 Then
.Offset(, 12).Value = 8
flag = True
End If
End If
End With
End Sub
ここ迄書いて思いました。ひょっとしてB列の値は入力では無いですね
多分。それはそうですよね。。。入力でなければ、意味ないですね。。
まぁ、せっかく?書いたので掲示します。
No.5
- 回答日時:
添付図を掲示される前に作成したコードなので
条件が質問文にある SK 大文字 となっています
図のように skとするといかがでしょうか
修正箇所 If InStr(r, "SK") = 0 Then など 3か所
このキーが変わらない場合は以上で良いと思いますが、
全角半角、大文字小文字が混在するような場合、
右辺と左辺を同じにして比較する必要がありますので
大文字か小文字にUCase関数 LCase関数などで合わせます
また、全角半角なども処理上、合わせる場合、StrConv関数を使用します
上記関数については
UCase関数 LCase関数 StrConv関数、などで調べてみてください。
No.4
- 回答日時:
連投すみません
>その都度請求する品目数が8品目以内と少ないので、商品コードはコード一覧表から手入力しています。
そっちでなく、条件を一覧表から取得した方が良くないかなぁ と思いました
また、一覧表があるなら、そこに税率項目を設定して
Vlookupなどの関数でも良さそうですが、VBAは他の処理も同時に出来るので、そのあたりの処理方法は何かを推奨する訳ではありません
いつも有難うございます。今日の段階では、入力シート内で出来る方法をと思っています。消費税率を手入力していますので、自動入力で消費税率の誤入力を防ごうと思っています。ご指導の商品一覧表に税率項目を設定してのVlookup関数の方も別途作成してみます。
なお、#2を修正し実行してみましたが作動しませんでしたので、ディパックにて確認したら最後から、If InStr(r, "SK") = 0 Then のところに帰ります。すみません。教えて下さい。よろしくお願いします。
No.2
- 回答日時:
こんにちは
コードとご説明から推測すると
Sub 消費税率判定()
Dim Sh21 As Worksheet
Dim Rng As Range
Dim r As Range
Set Sh21 = Worksheets("請求書")
Set Rng = Sh21.Range("B16:B23")
For Each r In Rng
If InStr(r, "SK") = 0 Then
If r >= 1 And r <= 1000 Then r.Offset(, 12).Value = 10
Else
If CInt(Split(r, "SK")(1)) >= 1 And CInt(Split(r, "SK")(1)) <= 200 Then
r.Offset(, 12).Value = 8
End If
End If
Next
MsgBox ("税率は正しいですか")
End Sub
ちょっと分かりにくい書き方で申し訳ないのですが、こんな感じかな?
商品コードはVBA内で設定していますが、実際にはシートに書いてあるのではないかと・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
JANコードとPOSコードは同じ?
-
1日に1人がこなせるプログラム...
-
access2021 VBA メソッドまたは...
-
Excel VBA素人です。VBAで図形...
-
VBA リストボックス(複数条件...
-
python コードについて(初学者...
-
1、Rstudioで回帰直線を求める...
-
access2003 クエリSQL文に...
-
変数名「cur」について
-
ExcelVBAで「Shift_JIS(MS932)...
-
フォームのテキストボックスが...
-
PreviewKeyDownイベントが2回...
-
videopadについて
-
過剰なオブジェクト指向脳から...
-
VB6のComboBox関連の書き方をVB...
-
コマンドボタンを押したときに...
-
GrapeCityのSpreadについて
-
自動採番のプログラム(?)
-
Nullの使い方が不正です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
JANコードとPOSコードは同じ?
-
1日に1人がこなせるプログラム...
-
JavaScriptの定数名が取り消し...
-
access2003 クエリSQL文に...
-
Nullの使い方が不正です。
-
sinカーブの表示のさせ方
-
access2021 VBA メソッドまたは...
-
IF文、条件分岐の整理方法
-
COBOLの文法
-
変数名「cur」について
-
【VB6】実行ファイルとした後、...
-
Exel VBA 別ブックから該当デ...
-
Excel VBA素人です。VBAで図形...
-
ペンダントライトのコードの色...
-
VBAでファイルオープン後にコー...
-
PreviewKeyDownイベントが2回...
-
ACCESSユニオンクエリでORDER B...
-
VB6のComboBox関連の書き方をVB...
-
Access DCountでの連番について
おすすめ情報
画面を添付します。
こんばんは。頂いたコードを試行しました。
B16:B23セルに商品コードを入れてみましたが、N16:N23セルに税率が表示されず0表示なので、マクロを実行すると,メッセージ×13 「消費税算出はできませんでした。型が一致しません」と表示されたので「OK]ボタンで押すと、該当のNセルに税率が表示されました。解決方法を教えて下さい。