• 締切済み

VBA

~フォームの構文~の続きです。 '[確定]ボタンをクリックした時の処理 Private Sub ConfirmButton_Click() Const NumberColumn As String = "A" '転記先のシートにおいて連番を記入する列の列番号 Const DateColumn As String = "B" '転記先のシートにおいて意見が投書された日付を記入する列の列番号 Const DepartmentColumn As String = "C" '転記先のシートにおいて所属部署名を転記する列の列番号 Const TextColumn As String = "D" '転記先のシートにおいて投書内容を転記する列の列番号 Const myGroupName As String = "DepartmentSelect" '所属部署選択用のオプションボタンのGroupNameプロパティに設定した値 Dim StoragePath As String, PostFileName As String, PostSheetName As String _ , Department As String, myText As String, PostBook As Workbook _ , PostRow As Long, PostingOK As Boolean, myWindow As Window _ , buf As Variant, co As Control, myInformation As String _ Department = "": myText = "" For Each co In Opinion_Box.Controls If TypeName(co) = "OptionButton" Then If co.Value = True And co.GroupName = "DepartmentSelect" Then _ Department = co.Caption End If Next co myText = Contents_of_posting.Value myInformation = "" If Department = "" Then myInformation = "選択回答 " If myText = "" Then myInformation = myInformation & "その他" myInformation = Replace(RTrim(myInformation), " ", "と") If myInformation = "" Then Select Case MsgBox("下記の内容が入力されています。" & vbCrLf _ & "この内容でアンケートを送信してよろしいですか?" & vbCrLf _ & " [はい] : この内容でアンケートを送信します。" & vbCrLf _ & " [いいえ] : 入力フォームに戻って投書内容を修正します。" & vbCrLf _ & " [キャンセル] : 投書を中止して入力フォームを閉じます。" _ & vbCrLf & vbCrLf & "【】 " & Department _ & vbCrLf & vbCrLf & "【】 " & vbCrLf & myText _ , vbYesNoCancel + vbInformation, "アンケート内容確認") Case vbYes GoTo Label_Posting Case vbCancel Unload Me End Select Exit Sub Else If MsgBox( _ myInformation & "が入力されていません。" & vbCrLf & vbCrLf _ & "[再試行] : フォームでの入力に戻ります。" & vbCrLf _ & "[キャンセル] : 入力を中止し、フォームを閉じます。" _ , vbRetryCancel + vbExclamation, "未入力項目あり") _ = vbCancel Then Unload Me Exit Sub End If Label_Posting: myInformation = vbCrLf _ & "フォームに入力いただいた内容を投函することができません。" Call Confirm_posting_place(myInformation, PostingOK _ , StoragePath, PostFileName, PostSheetName) With Application .ScreenUpdating = False .Calculation = xlManual .DisplayAlerts = False End With buf = "" On Error Resume Next Set PostBook = Windows(PostFileName).Parent buf = PostBook.Path On Error GoTo 0 If buf = StoragePath Then Set myWindow = PostBook.Windows(1).NewWindow Else Set PostBook = Workbooks.Open(StoragePath & "\" & PostFileName) Set myWindow = PostBook.Windows(1) End If myWindow.Visible = False With PostBook .Windows(.Windows.Count).Visible = False ThisWorkbook.Activate With .Sheets(PostSheetName) PostRow = 0 PostRow = .Range(DateColumn & .Rows.Count).End(xlUp).Row + 1 .Range(NumberColumn & PostRow).Value _ = Int(WorksheetFunction.Max(.Columns(NumberColumn))) + 1 With .Range(DateColumn & PostRow) .Value = Date .NumberFormatLocal = "ggge""年""m""月""d""日""(aaa)" End With .Range(DepartmentColumn & PostRow).Value = Department .Range(TextColumn & PostRow).Value = myText End With End With With myWindow .Visible = True .Parent.Save .Close End With ThisWorkbook.Activate With Application .Calculation = xlAutomatic .ScreenUpdating = True .DisplayAlerts = True End With MsgBox "ありがとうございました!アンケート回答入力内容が送信完了しました。", vbInformation, "完了" Unload Me End Sub 以上です。宜しくお願いします。

みんなの回答

  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.2

ごめんなさい、差し替えます。 問(1)のラジオボタンたちのGroupNameをGr1に 問(2)のラジオボタンたちのGroupNameをGr2に ・・・・ 問(6)のラジオボタンたちのGroupNameをGr6に変更し 次のようなコードにすればできると思います。 なお、利用者へのメッセージ表示部分、および 問ごとにラジオボタンを選択したかどうかのチェックは行っていません。 この部分の対応は、もともとのコードの構造がよろしくなく このコードを生かして対応しようとすると さらに読みにくいコードになってしまうだろうと思います。 '[確定]ボタンをクリックした時の処理 Private Sub ConfirmButton_Click() Const DateColumn As String = "B" Const NumberColumn As String = "A" Dim StoragePath As String Dim PostFileName As String Dim PostSheetName As String Dim Department(6) As String 'ここ Dim myText As String Dim PostBook As Workbook Dim PostRow As Long Dim PostingOK As Boolean Dim myWindow As Window Dim buf As Variant Dim co As Control Dim myInformation As String Dim QBaseCount As Integer  'ここ myText = "" For QBaseCount = 1 To 6  Department(QBaseCount) = ""  For Each co In Opinion_Box.Controls   If TypeName(co) = "OptionButton" Then   If co.Value = True And co.GroupName = "Gr" & Format(QBaseCount, "0") Then _    Department(QBaseCount) = co.Caption   End If  Next co Next QBaseCount myText = Contents_of_posting.Value myInformation = "" If Department(1) = "" Then  myInformation = "選択回答 " End If If myText = "" Then  myInformation = myInformation & "その他" End If myInformation = Replace(RTrim(myInformation), " ", "と") If myInformation = "" Then  Select Case MsgBox("下記の内容が入力されています。" & vbCrLf _  & "この内容でアンケートを送信してよろしいですか?" & vbCrLf _  & " [はい] : この内容でアンケートを送信します。" & vbCrLf _  & " [いいえ] : 入力フォームに戻って投書内容を修正します。" & vbCrLf _  & " [キャンセル] : 投書を中止して入力フォームを閉じます。" _  & vbCrLf & vbCrLf & "【】 " & Department(1) _  & vbCrLf & vbCrLf & "【】 " & vbCrLf & myText, _  vbYesNoCancel + vbInformation, "アンケート内容確認")     Case vbYes   GoTo Label_Posting   Case vbCancel   Unload Me  End Select  Exit Sub Else    If MsgBox( _  myInformation & "が入力されていません。" & vbCrLf & vbCrLf _  & "[再試行] : フォームでの入力に戻ります。" & vbCrLf _  & "[キャンセル] : 入力を中止し、フォームを閉じます。", _  vbRetryCancel + vbExclamation, "未入力項目あり") = _  vbCancel Then Unload Me  Exit Sub End If Label_Posting: myInformation = vbCrLf _ & "フォームに入力いただいた内容を投函することができません。" Call Confirm_posting_place(myInformation, PostingOK, _  StoragePath, PostFileName, PostSheetName) With Application  .ScreenUpdating = False  .Calculation = xlManual  .DisplayAlerts = False End With buf = "" On Error Resume Next Set PostBook = Windows(PostFileName).Parent buf = PostBook.Path On Error GoTo 0 If buf = StoragePath Then  Set myWindow = PostBook.Windows(1).NewWindow Else  Set PostBook = Workbooks.Open(StoragePath & "\" & PostFileName)  Set myWindow = PostBook.Windows(1) End If myWindow.Visible = False With PostBook  .Windows(.Windows.Count).Visible = False  ThisWorkbook.Activate    With .Sheets(PostSheetName)   PostRow = 0   PostRow = .Range(DateColumn & .Rows.Count).End(xlUp).Row + 1     .Cells(PostRow, 1).Value = _   Int(WorksheetFunction.Max(.Columns(NumberColumn))) + 1     With .Cells(PostRow, 2)   .Value = Date   .NumberFormatLocal = "ggge""年""m""月""d""日""(aaa)"   End With     For QBaseCount = 1 To 6   .Cells(PostRow, QBaseCount + 2).Value = Department(QBaseCount)   Next QBaseCount  'ここまで     .Cells(PostRow, 7).Value = myText  End With End With With myWindow  .Visible = True  .Parent.Save  .Close End With ThisWorkbook.Activate With Application .Calculation = xlAutomatic .ScreenUpdating = True .DisplayAlerts = True End With MsgBox "ありがとうございました!アンケート回答入力内容が送信完了しました。", vbInformation, "完了" Unload Me End Sub

  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.1

問(1)のラジオボタンたちのGroupNameをGr1に 問(2)のラジオボタンたちのGroupNameをGr2に ・・・・ 問(6)のラジオボタンたちのGroupNameをGr6に変更し 次のようなコードにすればできると思います。 なお、利用者へのメッセージ表示部分、および 問ごとにラジオボタンを選択したかどうかのチェックは行っていません。 この部分の対応は、もともとのコードの構造がよろしくなく このコードを生かして対応しようとすると さらに読みにくいコードになってしまうだろうと思います。 '[確定]ボタンをクリックした時の処理 Private Sub ConfirmButton_Click()    Dim StoragePath As String  Dim PostFileName As String  Dim PostSheetName As String  Dim Department(6) As String    Dim myText As String  Dim PostBook As Workbook  Dim PostRow As Long  Dim PostingOK As Boolean  Dim myWindow As Window  Dim buf As Variant  Dim co As Control  Dim myInformation As String  Dim QBaseCount As Integer     myText = ""    For QBaseCount = 1 To 6   Department(QBaseCount) = ""   For Each co In Opinion_Box.Controls    If TypeName(co) = "OptionButton" Then     If co.Value = True And co.GroupName = "Gr" & Format(QBaseCount, "0") Then _      Department(QBaseCount) = co.Caption    End If   Next co  Next QBaseCount    myText = Contents_of_posting.Value  myInformation = ""  If Department(1) = "" Then   myInformation = "選択回答 "  End If    If myText = "" Then   myInformation = myInformation & "その他"  End If    myInformation = Replace(RTrim(myInformation), " ", "と")    If myInformation = "" Then   Select Case MsgBox("下記の内容が入力されています。" & vbCrLf _   & "この内容でアンケートを送信してよろしいですか?" & vbCrLf _   & " [はい] : この内容でアンケートを送信します。" & vbCrLf _   & " [いいえ] : 入力フォームに戻って投書内容を修正します。" & vbCrLf _   & " [キャンセル] : 投書を中止して入力フォームを閉じます。" _   & vbCrLf & vbCrLf & "【】 " & Department(1) _   & vbCrLf & vbCrLf & "【】 " & vbCrLf & myText, _   vbYesNoCancel + vbInformation, "アンケート内容確認")       Case vbYes    GoTo Label_Posting    Case vbCancel    Unload Me   End Select   Exit Sub  Else      If MsgBox( _   myInformation & "が入力されていません。" & vbCrLf & vbCrLf _   & "[再試行] : フォームでの入力に戻ります。" & vbCrLf _   & "[キャンセル] : 入力を中止し、フォームを閉じます。", _   vbRetryCancel + vbExclamation, "未入力項目あり") = _   vbCancel Then Unload Me   Exit Sub  End If Label_Posting:  myInformation = vbCrLf _  & "フォームに入力いただいた内容を投函することができません。"    Call Confirm_posting_place(myInformation, PostingOK, _   StoragePath, PostFileName, PostSheetName)  With Application   .ScreenUpdating = False   .Calculation = xlManual   .DisplayAlerts = False  End With  buf = ""  On Error Resume Next  Set PostBook = Windows(PostFileName).Parent  buf = PostBook.Path  On Error GoTo 0    If buf = StoragePath Then   Set myWindow = PostBook.Windows(1).NewWindow  Else   Set PostBook = Workbooks.Open(StoragePath & "\" & PostFileName)   Set myWindow = PostBook.Windows(1)  End If    myWindow.Visible = False    With PostBook   .Windows(.Windows.Count).Visible = False   ThisWorkbook.Activate      With .Sheets(PostSheetName)    PostRow = 0    PostRow = .Range(DateColumn & .Rows.Count).End(xlUp).Row + 1        .Cells(PostRow, 1).Value = _    Int(WorksheetFunction.Max(.Columns(NumberColumn))) + 1        With .Cells(PostRow, 2)     .Value = Date     .NumberFormatLocal = "ggge""年""m""月""d""日""(aaa)"    End With        For QBaseCount = 1 To 6     .Cells(PostRow, wkCol + 2).Value = Department(QBaseCount)    Next wkCol   'ここまで       .Cells(PostRow, 7).Value = myText   End With    End With  With myWindow   .Visible = True   .Parent.Save   .Close  End With    ThisWorkbook.Activate  With Application   .Calculation = xlAutomatic   .ScreenUpdating = True   .DisplayAlerts = True  End With  MsgBox "ありがとうございました!アンケート回答入力内容が送信完了しました。", vbInformation, "完了"  Unload Me End Sub

関連するQ&A

  • エクセル VBAのオートフィルター実行時エラー

    エクセル VBAのオートフィルター実行時エラーについて教えて下さい VBAのオートフィルター実行時エラーで「’rangeクラスのAutoFilterメッソドが失敗しました’」 が表示されるのですが、エラーの内容がわかりません。教えて下さい。 Sub 複数条件でのデータ抽出() Const OrigSheetName = "データベース" Const PasteSheetName = "検索&抽出" Const ItemRow = 2 Const FirstColumn = "A" Const LastColumn = "CH" Const UnnecessaryColumns = "W:CD" Const SearchColumn1 = "CF" Const SearchColumn2 = "I" Const PasteCell = "A2" Dim OrigSheet As Worksheet, PasteSheet As Worksheet, _ LastRow As Long, Region As Variant, Period(1, 1) As Variant, _ temp As Variant, i As Long, c As Range Period(0, 0) = "1905/1/1" Period(1, 0) = "9999/12/31" Period(0, 1) = "以降" Period(1, 1) = "以前" If IsError(Evaluate("ROW('" & OrigSheetName & "'!A1)")) Then MsgBox "元データが入力されているシートとして設定されている" _ & vbCrLf & vbCrLf & OrigSheetName & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set OrigSheet = Sheets(OrigSheetName) If IsError(Evaluate("ROW('" & PasteSheetName & "'!A1)")) Then MsgBox "データの転記先のシートとして設定されている" _ & vbCrLf & vbCrLf & PasteSheetName & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set PasteSheet = Sheets(PasteSheetName) With OrigSheet LastRow = .Range(LastColumn & Rows.Count).End(xlUp).Row With .Range(LastColumn & Rows.Count).End(xlUp) If LastRow > .Row Then LastRow = .Row End With If LastRow <= ItemRow Then GoTo label9 label1: Region = Application.InputBox("参加または不参加を入力!", SearchColumn2 & _ "列に入力されている区分(A組またはB組)の中で、抽出条件を入力して下さい", _ , Type:=6) If Region = vbNullString Or Region = False Then temp = MsgBox("区分が入力されていません。" & vbCrLf _ & "区分の入力をやり直しますか?" & vbCrLf & vbCrLf _ & "[はい]:区分の入力をやり直します" & vbCrLf _ & "[いいえ]:処理を中止してマクロを終了します", _ vbYesNo + vbExclamation, "区分未入力") If temp = vbNo Then Exit Sub Else GoTo label1 End If End If For i = 0 To 1 label2: Period(i, 0) = Application.InputBox("期間指定" & i + 1, SearchColumn1 & _ "列に入力されている日付" _ & "で抽出する期間を指定して下さい。", _ Period(i, 0), Type:=2) If Period(i, 0) = vbNullString Or Period(i, 0) = False Then temp = MsgBox("日付が入力されていません。" & vbCrLf _ & "日付の入力をやり直しますか?" & vbCrLf & vbCrLf _ & "[はい]:日付の入力をやり直します" & vbCrLf _ & "[いいえ]:処理を中止してマクロを終了します", _ vbYesNo + vbExclamation, "日付未入力") If temp = vbNo Then Exit Sub Else GoTo label2 End If End If If IsDate(Period(i, 0)) Then If Format(Period(i, 0), "yyyy/mm/dd") = DateValue(Period(i, 0)) & "" _ Then GoTo label3 End If temp = MsgBox("入力された値は日付として扱う事が出来ません。" _ & vbCrLf & "日付の入力をやり直して下さい。", _ vbOKOnly + vbExclamation, "入力値不適切") GoTo label2 label3: Period(i, 0) = DateValue(Period(i, 0)) Next i End With With Application .ScreenUpdating = False .Calculation = xlManual End With With OrigSheet .Columns(UnnecessaryColumns).Hidden = True With .Range(SearchColumn1 & ItemRow & ":" & SearchColumn2 & LastRow) .AutoFilter Field:=1, Criteria1:=Region .AutoFilter Field:=Columns(SearchColumn1 & ":" & SearchColumn2).Columns.Count, _ Criteria1:=">=" & Period(0, 0), Operator:=xlAnd, Criteria2:="<=" & Period(1, 0) End With Set c = .Range(FirstColumn & ItemRow & ":" & LastColumn & LastRow) i = c.Resize(, 1).SpecialCells(xlCellTypeVisible).Cells.Count End With If i > 1 Then With PasteSheet .Range(PasteCell & ":" & .Cells.SpecialCells(xlCellTypeLastCell).Address).Clear c.SpecialCells(xlCellTypeVisible).Copy With .Range(PasteCell) .PasteSpecial Paste:=xlPasteValuesAndNumberFormats .PasteSpecial Paste:=xlPasteFormats End With End With End If With c.EntireColumn .AutoFilter .Hidden = False End With If i > 1 Then GoTo labelE label9: MsgBox DateCell & "該当するデータが見つかりません。" & vbCrLf _ & "マクロの実行を中止します。", vbExclamation, "データ無し" & vbCrLf & i labelE: With Application .CutCopyMode = False .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub 1か月ほど前までは問題なく実行出来ていました。元のデータベースの表を編集(列の追加)しましたが、元となるセルは変更しています。 宜しくお願いします!

  • エクセル VBAのオートフィルター実行時エラー

    VBAのオートフィルター実行時エラーで「’rangeクラスのAutoFilterメッソドが失敗しました’」 が表示されるのですが、エラーの内容がわかりません。教えて下さい。 Sub 複数条件でのデータ抽出() Const OrigSheetName = "データベース" Const PasteSheetName = "検索&抽出" Const ItemRow = 2 Const FirstColumn = "A" Const LastColumn = "CH" Const UnnecessaryColumns = "W:CD" Const SearchColumn1 = "CF" Const SearchColumn2 = "I" Const PasteCell = "A2" Dim OrigSheet As Worksheet, PasteSheet As Worksheet, _ LastRow As Long, Region As Variant, Period(1, 1) As Variant, _ temp As Variant, i As Long, c As Range Period(0, 0) = "1905/1/1" Period(1, 0) = "9999/12/31" Period(0, 1) = "以降" Period(1, 1) = "以前" If IsError(Evaluate("ROW('" & OrigSheetName & "'!A1)")) Then MsgBox "元データが入力されているシートとして設定されている" _ & vbCrLf & vbCrLf & OrigSheetName & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set OrigSheet = Sheets(OrigSheetName) If IsError(Evaluate("ROW('" & PasteSheetName & "'!A1)")) Then MsgBox "データの転記先のシートとして設定されている" _ & vbCrLf & vbCrLf & PasteSheetName & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set PasteSheet = Sheets(PasteSheetName) With OrigSheet LastRow = .Range(LastColumn & Rows.Count).End(xlUp).Row With .Range(LastColumn & Rows.Count).End(xlUp) If LastRow > .Row Then LastRow = .Row End With If LastRow <= ItemRow Then GoTo label9 label1: Region = Application.InputBox("参加または不参加を入力!", SearchColumn2 & _ "列に入力されている区分(A組またはB組)の中で、抽出条件を入力して下さい", _ , Type:=6) If Region = vbNullString Or Region = False Then temp = MsgBox("区分が入力されていません。" & vbCrLf _ & "区分の入力をやり直しますか?" & vbCrLf & vbCrLf _ & "[はい]:区分の入力をやり直します" & vbCrLf _ & "[いいえ]:処理を中止してマクロを終了します", _ vbYesNo + vbExclamation, "区分未入力") If temp = vbNo Then Exit Sub Else GoTo label1 End If End If For i = 0 To 1 label2: Period(i, 0) = Application.InputBox("期間指定" & i + 1, SearchColumn1 & _ "列に入力されている日付" _ & "で抽出する期間を指定して下さい。", _ Period(i, 0), Type:=2) If Period(i, 0) = vbNullString Or Period(i, 0) = False Then temp = MsgBox("日付が入力されていません。" & vbCrLf _ & "日付の入力をやり直しますか?" & vbCrLf & vbCrLf _ & "[はい]:日付の入力をやり直します" & vbCrLf _ & "[いいえ]:処理を中止してマクロを終了します", _ vbYesNo + vbExclamation, "日付未入力") If temp = vbNo Then Exit Sub Else GoTo label2 End If End If If IsDate(Period(i, 0)) Then If Format(Period(i, 0), "yyyy/mm/dd") = DateValue(Period(i, 0)) & "" _ Then GoTo label3 End If temp = MsgBox("入力された値は日付として扱う事が出来ません。" _ & vbCrLf & "日付の入力をやり直して下さい。", _ vbOKOnly + vbExclamation, "入力値不適切") GoTo label2 label3: Period(i, 0) = DateValue(Period(i, 0)) Next i End With With Application .ScreenUpdating = False .Calculation = xlManual End With With OrigSheet .Columns(UnnecessaryColumns).Hidden = True With .Range(SearchColumn1 & ItemRow & ":" & SearchColumn2 & LastRow) .AutoFilter Field:=1, Criteria1:=Region .AutoFilter Field:=Columns(SearchColumn1 & ":" & SearchColumn2).Columns.Count, _ Criteria1:=">=" & Period(0, 0), Operator:=xlAnd, Criteria2:="<=" & Period(1, 0) End With Set c = .Range(FirstColumn & ItemRow & ":" & LastColumn & LastRow) i = c.Resize(, 1).SpecialCells(xlCellTypeVisible).Cells.Count End With If i > 1 Then With PasteSheet .Range(PasteCell & ":" & .Cells.SpecialCells(xlCellTypeLastCell).Address).Clear c.SpecialCells(xlCellTypeVisible).Copy With .Range(PasteCell) .PasteSpecial Paste:=xlPasteValuesAndNumberFormats .PasteSpecial Paste:=xlPasteFormats End With End With End If With c.EntireColumn .AutoFilter .Hidden = False End With If i > 1 Then GoTo labelE label9: MsgBox DateCell & "該当するデータが見つかりません。" & vbCrLf _ & "マクロの実行を中止します。", vbExclamation, "データ無し" & vbCrLf & i labelE: With Application .CutCopyMode = False .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub 1か月ほど前までは問題なく実行出来ていました。元のデータベースの表を編集(列の追加)しましたが、元となるセルは変更しています。 宜しくお願いします!

  • VBAについて

    添付画像左側のデータベースから添付画像右側のように検索結果をVBAで求めたいのですが、なかなか上手くいきません。 昨日、質問し回答を頂いたのですが私の使用しているパソコン(win7 EXCEL2010)が良くないのか、回答者様は問題なく動作したコードでも動作成功しませんでした。 以下のコードが回答頂いたものです。 宜しくお願い致します。 Sub QNo9035948_VBA関数について() Const FirstRowD As Long = 3 '実際のデータが入力されている一番上の行の行番号 Const ProductColumnD As String = "A" 'データベースにおいて品名が入力されている列 Const DelivColumnD As String = "B" 'データベースにおいて配達先が入力されている列 Const QuantColumnD As String = "C" 'データベースにおいて数量が入力されている列 Const FirstRowR As Long = 3 '検索結果(search Results)において抽出結果を書き込み始める行の1つ上の行の行番号 Const ProductColumnR As String = "E" '検索結果において品名を書き込む列 Const QuantColumnR As String = "F" '検索結果において配達合計数量を書き込む列 Const DetailColumnR As String = "G" '検索結果において配達先×数量を書き込む列 Dim LastRowD As Long, LastRowR As Long, c As Range, i As Long 'データが入力されている最終行の行番号を取得 LastRowD = Range(ProductColumnD & Rows.Count).End(xlUp).Row If LastRowD < FirstRowD Then MsgBox "データがありません。" & vbCrLf & "マクロを終了します。", _ vbExclamation, "データ無し" Exit Sub End If '処理を高速化するため自動で行われる処理の中で不要なものをOFF With Application .ScreenUpdating = False 'モニター表示の更新をしない .Calculation = xlManual '計算モードを手動に切り替え End With '品名の一覧を作成 Range(ProductColumnR & FirstRowR & ":" & DetailColumnR _ & Cells.SpecialCells(xlCellTypeLastCell).Row).Delete With Range(ProductColumnR & FirstRowR).Resize(LastRowD - FirstRowD + 1, 1) .Value = Range(ProductColumnD & FirstRowD).Resize(.Rows.Count, 1).Value .RemoveDuplicates Columns:=1, Header:=xlNo ActiveSheet.Sort.SortFields.Clear .Sort Key1:=.Resize(1, 1), Order1:=xlAscending, Header:=xlNo ActiveSheet.Sort.SortFields.Clear End With '検索結果の列においてデータが入力されている最終行の行番号を取得 LastRowR = Range(ProductColumnR & Rows.Count).End(xlUp).Row With Range(QuantColumnR & FirstRowR & ":" & QuantColumnR & LastRowR) .FormulaR1C1 = "=SUMIF(C" & Columns(ProductColumnD).Column & ",RC" & _ Columns(ProductColumnR).Column & ",C" & Columns(QuantColumnD).Column & ")" '配達合計数量を計算するWorksheet関数を入力 .Calculate '配達合計数量の計算を実行 .Value = .Value 'Worksheet関数の計算結果を値としてセルに再入力 End With '配達先×数量を入力 For i = FirstRowD To LastRowD If Range(ProductColumnD & i).Value <> "" _ And Range(DelivColumnD & i).Value <> "" Then If WorksheetFunction.CountIfs( _ Range(ProductColumnD & FirstRowD).Resize(i - FirstRowD + 1), _ Range(ProductColumnD & i), _ Range(DelivColumnD & FirstRowD).Resize(i - FirstRowD + 1), _ Range(DelivColumnD & i)) _ = 1 Then Set c = Range(DetailColumnR & WorksheetFunction. _ Match(Range(ProductColumnD & i).Value, Columns(ProductColumnR), 0)) c.Value = c.Value & ", " & Range(DelivColumnD & i).Value & "×" & _ WorksheetFunction.SumIfs(Columns(QuantColumnD), Columns(ProductColumnD), _ Range(ProductColumnR & c.Row).Value, Columns(DelivColumnD), _ Range(DelivColumnD & i).Value) End If End If Next i For Each c In _ Range(DetailColumnR & FirstRowR & ":" & DetailColumnR & LastRowR) c.Value = Mid(c.Value, 3) Next c With Application .Calculation = xlAutomatic '計算モードを自動に切り替え .ScreenUpdating = False 'モニター表示の更新を行う End With End Sub

  • エクセル VBA について

    エクセルで、 ダブルクリックしたら"*"を表示したい範囲に【入力】という名前をつけ、 ダブルクリックしたら9つ左のセルの内容を表示したい範囲に【金額】という名前をつけ、 二つの構文?をVisual Basicに作成したんですが、エラーが出てしまいます。 ひとつずつだと上手くいくのですが、なぜでしょうか? わかる方教えてください。 あと申し訳ないのですが、VBAはまったくわからないため、ネット上で構文をコピーして貼り付けました。 そんな者でもわかる修正の説明をお願いいたします。 以下が作成し、エラーとなってしまう構文です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "金額" If Target.Value = "" Then Target.Value = Target.Offset(0, -9).Value Cancel = True End If End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "入力" If Not Intersect(Range(RangeName), Target) Is Nothing Then Cancel = True If Target = "*" Then Target = "" Else Target = "*" End If End If End Sub

  • VBAが止まります。

    皆さん、いつもありがとうございます。 下から14行目の『 objMail.Attachments.Add asrs1』で止まってしまします。 下から14行目の『 objMail.Attachments.Add asrs1』で止まってしまします。 asrs1をadrs1へ修正したりしましたが、改善されません。 昨日まで動いたいたのですが。 皆様、修正方法を教えていただけますでしdょうか。 ------------------------------------------------------- Sub メール作成() Dim objOutlook As Outlook.Application Dim objMail As Outlook.MailItem Dim wsMail As Worksheet Dim filead As String Dim tenp1 As String Dim tenp2 As String 'メール立ち上げ Set objOutlook = New Outlook.Application Set wsMail = ThisWorkbook.Sheets("リスト") '添付ファイルのアドレスを変数にする filead = Worksheets("リスト").Range("B3").Value '共通添付データのアドレスを読む tenp1 = filead & "\" & Worksheets("リスト").Range("B4") tenp2 = filead & "\" & Worksheets("リスト").Range("B5") Dim kobetsumail1 As String Dim kobetsumail2 As String Dim adrs1 As String Dim asrs2 As String '変数iを設定。最初は1 Dim i As Long i = 1 '送付前の確認メッセージ Dim rc As Long rc = MsgBox("記載に誤りが無いことを確認しましたか?", vbYesNo + vbQuestion, "確認") If rc = vbNo Then MsgBox "中断しました" End End If '基準となるセルを選択 Worksheets("リスト").Select Range("B7").Select '取引先名が書かれているB列が空欄になるまで続ける Do Until ActiveCell.Offset(i, 0).Value = "" '送付チェック欄が○なら作業を続ける If ActiveCell.Offset(i, 2).Value = "○" Then Set objMail = objOutlook.CreateItem(olMailTtem) '個別メールのデータ名称を読む Dim CC12(1) As String CC12(0) = ActiveCell.Offset(i, 6).Value CC12(1) = ActiveCell.Offset(i, 8).Value 'メールを作成する With wsMail objMail.to = ActiveCell.Offset(i, 4).Value objMail.CC = Join(CC12, ";") objMail.Subject = Range("B1").Value objMail.Bodyformat = olFormatPlain objMail.body = Range("B7").Offset(i, 0) & vbCrLf & Range("E7").Offset(i, 0) & "様" & vbCrLf & vbCrLf & Range("B2").Value & vbCrLf & vbCrLf kobetsumail1 = ActiveCell.Offset(i, 9).Value asrs1 = filead & "\" & kobetsumail1 kobetsumail2 = ActiveCell.Offset(i, 10).Value asrs2 = filead & "\" & kobetsumail2 If Range("B4").Value <> "" Then objMail.Attachments.Add tenp1 End If If Range("B5").Value <> "" Then objMail.Attachments.Add tenp2 End If If ActiveCell.Offset(i, 9).Value <> "" Then objMail.Attachments.Add asrs1 End If If ActiveCell.Offset(i, 10).Value <> "" Then objMail.Attachments.Add asrs2 End If objMail.Display objMail.Save End With End If i = i + 1 Loop Set objOutlook = Nothing MsgBox "下書きに保管しました" End Sub

  • VBAについて

    現在マクロ勉強中です。 教えて頂きたいのは、登録ボタンで指定セルの台帳への転記する方法です。 Private Sub cmdToroku_Click() Dim myrow As Integer Option Explicit With ActiveSheet If .Range("A4").Value = "" Then myrow = 1 Else myrow = .Range(Cells(.Rows.Count, 1).End(xlUp).Address).Row + 1 End If .Cells(myrow, 1).Value = TextBox1.Value End With End Sub 上記ですと、開いているシートのA1に入力されてしまいます。 別シートへ転記したい場合どのあたりを修正すればよいのでしょうか? お力お借りできれば幸いです。

  • VBAでoutlook365が起動しません。

    VBAでoutlook365が起動しません。EXCELまたは、OUTLOOK設定がおかしいのでしょうか。 メール一括作成のボタンを押しても『記載に誤りが無いことを確認しましたか?』『"送信完了しました』のメッセージは出るのですが、outlookが起動しませんし下書ホルダにも保存されません。 EXCELは他のマクロは動作しますし、Outlookはセキュリティ(トラストセンター)設定も有効です。どなたかご教示いただけますようお願いいたします。 添付でEXCEL画面の画像と下記に対象の記述を記します。 ------------------------------------------------------- Sub メール作成() Dim objOutlook As Outlook.Application Dim objMail As Outlook.MailItem Dim wsMail As Worksheet Dim filead As String Dim tenp1 As String Dim tenp2 As String 'メール立ち上げ Set objOutlook = New Outlook.Application Set wsMail = ThisWorkbook.Sheets("リスト") '添付ファイルのアドレスを変数にする filead = Worksheets("リスト").Range("B3").Value '共通添付データのアドレスを読む tenp1 = filead & "\" & Worksheets("リスト").Range("B4") tenp2 = filead & "\" & Worksheets("リスト").Range("B5") Dim kobetsumail1 As String Dim kobetsumail2 As String Dim adrs1 As String Dim asrs2 As String '変数iを設定。最初は1 Dim i As Long i = 1 '送付前の確認メッセージ Dim rc As Long rc = MsgBox("記載に誤りが無いことを確認しましたか?", vbYesNo + vbQuestion, "確認") If rc = vbNo Then MsgBox "中断しました" End End If '基準となるセルを選択 Worksheets("リスト").Select Range("B7").Select '取引先名が書かれているB列が空欄になるまで続ける Do Until ActiveCell.Offset(i, 0).Value = "" '送付チェック欄が○なら作業を続ける If ActiveCell.Offset(i, 2).Value = "○" Then Set objMail = objOutlook.CreateItem(olMailTtem) '個別メールのデータ名称を読む Dim CC12(1) As String CC12(0) = ActiveCell.Offset(i, 6).Value CC12(1) = ActiveCell.Offset(i, 8).Value 'メールを作成する With wsMail objMail.to = ActiveCell.Offset(i, 4).Value objMail.CC = Join(CC12, ";") objMail.Subject = Range("B1").Value objMail.Bodyformat = olFormatPlain objMail.body = Range("B7").Offset(i, 0) & vbCrLf & Range("E7").Offset(i, 0) & "様" & vbCrLf & vbCrLf & Range("B2").Value & vbCrLf & vbCrLf kobetsumail1 = ActiveCell.Offset(i, 9).Value asrs1 = filead & "\" & kobetsumail1 kobetsumail2 = ActiveCell.Offset(i, 10).Value asrs2 = filead & "\" & kobetsumail2 If Range("B4").Value <> "" Then objMail.Attachments.Add tenp1 End If If Range("B5").Value <> "" Then objMail.Attachments.Add tenp2 End If If ActiveCell.Offset(i, 9).Value <> "" Then objMail.Attachments.Add asrs1 End If If ActiveCell.Offset(i, 10).Value <> "" Then objMail.Attachments.Add asrs2 End If objMail.Display End With End If i = i + 1 Loop Set objOutlook = Nothing MsgBox "送信完了しました" End Sub

  • vba ユーザーフォームにて質問

    勉強のためにvbaにユーザーフォームを作っています。 画像のとおり青色が塗られている箇所に、ユーザーフォームで社員名、件数を 転記したいです。 ユーザーフォーム 社員名 件数 を入力したら範囲はC3からC15転記されます。 転記終わったら、D3からD15に転記。この作業をH列まで行いたいのですが、 C3の列以降転記できません。 お答えできる方いればよろしくお願いします。 Private Sub CommandButton1_Click() Dim rc As Long Dim retu As Long Dim Ctrl As Control If Me.txtComboBox1.Value = "" Then MsgBox "社員名を選択してください!", vbOKOnly Me.txtComboBox1.SetFocus Exit Sub End If rc = MsgBox("件数を入力しますか?", vbYesNo) If rc = vbYes Then MsgBox "実行する" Else MsgBox "中止しました" Exit Sub End If retu = Cells(2, Columns.Count).End(xlToLeft).Column + 1 Cells(3, retu).Value = Me.txtComboBox1.Value ←社員を選択 Cells(4, retu).Value = Me.txtsuzuki.Value  ←売れた件数 Cells(5, retu).Value = Me.txttoyota.Value  ←売れた件数 Cells(6, retu).Value = Me.txthonnda.Value   ←売れた件数 For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" End If Next Ctrl End Sub

  • エクセルでセルの値がTRUEかFALSEか判定

    Q3:R19の表があります。 Q列にはTRUEかFALSEが入りますが、空白や文字列の場合もあります。 R列には文字列です。 Q列でFALSEのセルだけ、同じ行のとなりのR列の文字列を順に抜き出し、メッセージボックスに表示したいのです。 下記のようなVBAを書いてみましたが、Q列が空白や文字列の場合まで抽出されてしまいます。 これを排除するいい方法はないでしょうか? Sub test01()   Dim msg As String   Dim i As Long   With Sheets("LOG")     For i = 3 To 19       If .Range("Q" & i).Value = False Then '        Debug.Print  i & "-" & .Range("R" & i).Value         msg = msg & .Range("R" & i).Value & vbCrLf       End If     Next i   End With   If msg <> "" Then     MsgBox msg & vbCrLf & "上記により不可です。", vbCritical   End If End Sub

  • VBAのIF構文について

    VBAでまたわからないところが出てきたので質問させてください。 ActiveWorkbookのworksheet1のa1セルに何か文字列が入っていると仮定して、下記のstrSUB に入る文字列をifで分岐させたいのですが、どのような構文が適していますでしょうか? 下記の内容では、エラーになってしまいます。 識者の方々、よろしくお願いいたします。 ----------------------------------------------------------------- Sub test送信メール作成() Dim oApp As Object Dim objMAIL As Object Dim strSUB As String Dim strBODY As String Set oApp = CreateObject("Outlook.Application") Set objMAIL = oApp.CreateItem(0) strSUB = if ActiveWorkbook.Worksheets(1).range("a1") = "abc" then "aaa" Else "bbb" End If strBODY = "a" & vbCrLf _ & "b" & vbCrLf _ & "c" With objMAIL .To = "aaa@bbb.com" .CC = "ccc@ddd.com" .Subject = strSUB .Body = strBODY .Display End With End Sub

専門家に質問してみよう