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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

4328閲覧

Excelアドインの実行速度向上と右クリックメニューへの追加について

porepore

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/03/15 10:34

お世話になります。
C#を使用してExcelアドインを作成した際の実行速度の向上と
右クリックメニューに追加した際の不思議な現象についてお聞きしたいです。

作成中のアドインは選択範囲内の、全角英数字を半角英数字に変換するという物を作成しています。
現在、10万セルの処理速度は45秒程度なのでこれの速度向上をする方法をお聞きしたいです。
また、右クリックメニューに表示される場合とされない場合があります。
同じブック内の別のワークシートで右クリックをしても表示されない場合がありました。
当方ではこの現象について検討もつかないためご教授のほどよろしくお願いいたします。

c#

1using System; 2using System.Drawing; 3using System.Collections.Generic; 4using System.Linq; 5using System.Text; 6using System.Windows.Forms; 7using System.Xml.Linq; 8using Excel = Microsoft.Office.Interop.Excel; 9using Office = Microsoft.Office.Core; 10using Microsoft.Office.Tools.Excel; 11 12using CSharp.Japanese.Kanaxs; 13 14namespace myAddin 15{ 16 public partial class ThisAddIn 17 { 18 private Office.CommandBarButton MenuText; 19 20 private void DefineMenu() 21 { 22 Office.MsoControlType menuItem = Office.MsoControlType.msoControlButton; 23 24 MenuText = (Office.CommandBarButton)Application.CommandBars["Cell"].Controls.Add(menuItem, missing, missing, 1, true); 25 26 MenuText.Style = Office.MsoButtonStyle.msoButtonCaption; 27 MenuText.Caption = "変換"; 28 MenuText.Tag = "0"; 29 } 30 31 private void ThisAddIn_Startup(object sender, EventArgs e) 32 { 33 DefineMenu(); 34 35 MenuText.Click += new Office._CommandBarButtonEvents_ClickEventHandler(ZenToHan); 36 } 37 38 private void ThisAddIn_Shutdown(object sender, EventArgs e) 39 { 40 } 41 42 void ZenToHan(Office.CommandBarButton Ctrl, ref bool CancelDefault) 43 { 44 //タイマー 45 46 var sw = new System.Diagnostics.Stopwatch(); 47 sw.Start(); 48 49 50 //ダイアログ表示 51 DialogResult result = MessageBox.Show("実行しますか?", "確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation); 52 53 //ダイアログがOKなら実行 54 if (result == DialogResult.OK) 55 { 56 var selectedRange = Globals.ThisAddIn.Application.Selection as Excel.Range; 57 var selectedAreas = selectedRange.Areas as Excel.Areas; 58 59 int i = 0; 60 61 //選択中セルを全ループ 62 foreach (Excel.Range area_i in selectedAreas) 63 { 64 int r = 1; 65 foreach (Excel.Range row in area_i.Rows) 66 { 67 int c = 1; 68 foreach (Excel.Range col in row.Columns) 69 { 70 col.Value = KanaEx.ToHankaku(col.Value); 71 72 c++; 73 CountLoop++; 74 } 75 r++; 76 } 77 i++; 78 } 79 80 //タイマーストップ表示 81 82 sw.Stop(); 83 TimeSpan ts = sw.Elapsed; 84 MessageBox.Show($" {ts}"); 85 86 } 87 } 88 89 #region VSTO で生成されたコード 90 91 /// <summary> 92 /// デザイナーのサポートに必要なメソッドです。 93 /// このメソッドの内容をコード エディターで変更しないでください。 94 /// </summary> 95 private void InternalStartup() 96 { 97 this.Startup += new System.EventHandler(ThisAddIn_Startup); 98 this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); 99 } 100 101 #endregion 102 } 103} 104

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

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

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

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

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

guest

回答1

0

C#はあまり詳しくなく、VBAがメインの人です。

実行速度

Excelのセルの値(Value)は
単一セルの場合はその中身なのですが
セル範囲に対してはその範囲の二次元配列(.NETで言うObject[,]型)を取得、設定できます。

  1. セル範囲から二次元配列を取得
  2. その配列内の値に対して操作
  3. セル範囲に書き戻し

とすると、不要Rangeのインスタンス、COM-.NET間のマーシャリングが削減されるため速度が向上すると思われます。

提示のコードではarea_iから配列化してあげれば良いと思います。

右クリックメニュー

セル選択時のメニューは一種類では無いため、特殊なセル範囲(例:テーブル内のセル)を選択している場合は、使用されるメニューが変わります。

CommandBarsオブジェクトを使用する方法はやや古い方法となります。

Office2010以降ならOffice Fluent Ribbon UIを使用して、右クリックメニューにボタンなどを追加することができます。

また関連資料をみるとわかるのですが、選択しているセルによってメニューが

通常のセル選択とテーブル内セル選択ではメニューが異なる

投稿2018/03/15 14:30

imihito

総合スコア2166

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問