- ベストアンサー
Excel におけるプログラミングテクニック
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
他の方のコメントにありますように 関数では実現することができません。 他方、 >何というマクロ関数を使えばいいでしょうか。 失礼ながら、このような逆質問が起きるようでは VBAでの解決は厳しいかもしれませんが サンプルコードをポストしますので よかったらVBAに挑戦してみてください。 サンプルコードの AddMenu を実行することで、添付画像のように コンテキストメニューに新たなメニューが登場します。 予め複写範囲を選択して「独自の複写」を選び 任意セルを選択し、「独自の貼付」を選択します。 Option Explicit '//共通変数定義 Dim AryData() As Variant Dim RowCnt As Long Dim ColCnt As Long '//複写 Sub OriginalCopy() Dim RowCounter As Long Dim ColCounter As Long RowCnt = Selection.Rows.Count ColCnt = Selection.Columns.Count ReDim AryData(RowCnt, ColCnt) For RowCounter = 1 To RowCnt For ColCounter = 1 To ColCnt AryData(RowCounter, ColCounter) = _ Selection.Cells(RowCounter, ColCounter).Value Next ColCounter Next RowCounter End Sub '//貼付け Sub OriginalPaste() Dim RowCounter As Long Dim ColCounter As Long Dim MyTotal As Long Dim tgRange As Range For ColCounter = 1 To ColCnt Selection.Cells(1, ColCounter).Value = _ AryData(1, ColCounter) Next ColCounter For ColCounter = 1 To ColCnt - 1 Selection.Cells(2, ColCounter).Value = _ AryData(2, ColCounter) Next ColCounter MyTotal = 0 For RowCounter = 2 To RowCnt Selection.Cells(RowCounter, ColCnt).Value = _ AryData(RowCounter, ColCnt) MyTotal = MyTotal + Selection.Cells(RowCounter, ColCnt).Value Next RowCounter Selection.Cells(RowCnt + 1, 1).Value = "合計" Selection.Cells(RowCnt + 1, ColCnt).Value = MyTotal For ColCounter = 1 To ColCnt - 1 Set tgRange = Range(Selection.Cells(2, ColCounter), _ Selection.Cells(2, ColCounter).Offset(RowCnt - 2, 0)) tgRange.Merge Next ColCounter Set tgRange = Range(Selection.Cells(RowCnt + 1, 1), _ Selection.Cells(RowCnt + 1, 1).Offset(0, ColCnt - 2)) tgRange.Merge Set tgRange = Range(Selection.Cells(1, 1), _ Selection.Cells(1, 1).Offset(RowCnt, ColCnt - 1)) tgRange.Borders(xlDiagonalDown).LineStyle = xlNone tgRange.Borders(xlDiagonalUp).LineStyle = xlNone With tgRange.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With tgRange.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With tgRange.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With tgRange.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With tgRange.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With tgRange.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With End Sub '//コンテキストメニューに追加 Sub AddMenu() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "独自の複写" .OnAction = "OriginalCopy" .BeginGroup = False End With Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "独自の貼付" .OnAction = "OriginalPaste" .BeginGroup = False End With End Sub '//コンテキストメニューから削除 Sub DelMenu() Application.CommandBars("Cell").Controls("独自の複写").Delete Application.CommandBars("Cell").Controls("独自の貼付").Delete End Sub
その他の回答 (2)
今回、上の表のプロジェクト地域は2つとも同じですが 異なる場合もあってなどいろんなパターンが有って使っていくと思って良いですか? それでも下の表では重複を除いて表示して合計金額を出したい と。 例では1行ですが、場合によっては複数行になると。 No.1さんの言う通りマクロです。 そして「何というマクロ関数ですか?」と聞いていますが、違います。 VBAでプログラミングして関数を作るのです。 重複を除いた件数分、下の表に自動で行を追加して表を作る事が出来ます。 プロジェクト地域が出れば金額は簡単でSUMIF関数で良いです。 1回きりしか使わないと言うのなら、 上の表のプロジェクト地域から重複を除いて下のプロジェクト地域を作りSUMIF関数入れれば良いです。 重複を除くやり方は様々です。 別なシートでソートして関数入れても良いし。(IF関数で上と下が違っていたらフラグを立てるとか) うちの会社ならsakuraエディッタに貼ってソートして「重複を除く」処理で対処します。 こいいうの好きだからタダで作ってあげても良いんだけど 個人のやり取りを禁止しているこのサイトでは連絡先交換する術が無いですね。。。 頑張ってください。
お礼
非常にご丁寧なご説明ありがとうございます。ご親切ですね。感謝いたします。 サクラエディタを知らなかったので試してみます。 ご回答ありがとうございました。
- aokii
- ベストアンサー率23% (5210/22062)
可能ですがマクロになります。
お礼
何というマクロ関数を使えばいいでしょうか。
お礼
素人的な質問に付き合ってくださり感謝です。いただいたVBAのコードを写経してみます。 ご回答ありがとうございました。