VBAでセルの罫線に描画する方法

May 17,2017 12:03 AM
Category:[VB/VBA]
Tag:[Excel, VBA]
Permalink

VBAでセルの罫線に描画する方法を紹介します。

VBAでセルの罫線に描画する

1.問題点

VBAでセルの罫線上に、冒頭のスクリーンショットのように矢印を描画する作業が発生しました。

描画する際に分かっている情報は、セルの番地ではなく、開始点および終点の行と列の番号(「3,2」や「3,5」など)ですが、この情報を元に描画する方法が分かりません。

ということで、セルの罫線に描画する方法を紹介します。

2.セルの罫線に描画する

描画するサンプルを下記に示します。

Sub Test()
    Dim start_cell As String
    Dim end_cell As String
    Dim myRange As Range
 
    start_cell = Cells(3, 2).Address
    end_cell = Cells(3, 5).Address
    Set myRange = Range(start_cell, end_cell)
 
    With ActiveSheet.Shapes.AddLine(myRange.Left, myRange.Top, myRange.Left + myRange.Width, myRange.Top).Line
       .ForeColor.RGB = vbBlack
       .EndArrowheadStyle = msoArrowheadTriangle
    End With
End Sub

以下、コードの解説です。

開始点となるセルの番地をCellsプロパティで取得します。セルの番地が予め分かっていればこの行は不要です。

start_cell = Cells(3, 2).Address

同様に、終点となるセルの番地を取得します。

end_cell = Cells(3, 5).Address

Rangeプロパティで2つのセルの範囲を取得します。

Set myRange = Range(start_cell, end_cell)

下のように、Cellsプロパティとあわせて1行にまとめることもできます。

Set myRange = Range(Cells(3, 2), Cells(3, 5))

最後にShapes.AddLineメソッドで線を描画します。

With ActiveSheet.Shapes.AddLine(myRange.Left, myRange.Top, myRange.Left + myRange.Width, myRange.Top).Line
   .ForeColor.RGB = vbBlack
   .EndArrowheadStyle = msoArrowheadTriangle
End With

AddLineメソッドのパラメータは次のとおりです。

  • 第1パラメータ:開始点のX座標
  • 第2パラメータ:開始点のY座標
  • 第3パラメータ:終了点のX座標
  • 第4パラメータ:終了点のY座標

上記のサンプルでは、各パラメータに次のようにあてはめています。

  • 第1パラメータ(開始点のX座標):Rangeプロパティの左端
  • 第2パラメータ(開始点のY座標):Rangeプロパティの上端
  • 第3パラメータ(終了点のX座標):Rangeプロパティの左端に横幅を加えたもの
  • 第4パラメータ(終了点のY座標):Rangeプロパティの上端

また、

  • ForeColor.RGB
  • EndArrowheadStyle

は、線の色および終点のスタイル(矢印)を指定しています。

これで冒頭のスクリーンショットのような線を描画することができます。

点線の場合はAddLineメソッドに下記を追加します。

.DashStyle = msoLineDash
Comments [0] | Trackbacks [0]

C++で「Enable multithreading to use std::thread: Operation not permitted」というエラーになる場合の対処

May 12,2017 12:03 AM
Category:[C/C++]
Tag:[C/C++]
Permalink

C++で「Enable multithreading to use std::thread: Operation not permitted」というエラーになる場合の対処について紹介します。

1.問題点

C++11で実装されたstd::threadを使ったプログラムを作ってみました。

sample.cpp

#include <cstdlib>
#include <iostream>
#include <thread>
 
void task(const std::string msg) {
    std::cout << msg << std::endl;
}
 
int main(int argc, char **argv) {
    std::thread t(task, "Hello World!!");
    t.join();
    return 0;
}

が、このプログラムを実行すると下記の「Enable multithreading to use std::thread: Operation not permitted」というエラーが発生します。

% g++ -std=c++11 sample.cpp
% ./a.out
terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted
中止 (コアダンプ)

が、このエラーが発生する理由がわかりません。

ということで、このエラーになる場合の対処について紹介します。

2.原因と対処

原因は、コンパイル時に"-pthread"オプションを付与していないためです。

std::threadを利用したプログラムで"-pthread"オプションなしでコンパイルすると、コンパイル時にはエラーにならずに実行時エラーになります。

ということで、"-pthread"オプションを付与してコンパイルすればOKです。

% g++ -std=c++11 -pthread sample.cpp
% ./a.out
Hello World!!

3.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]

C++でスレッドIDを取得する方法

May 11,2017 12:03 AM
Category:[C/C++]
Tag:[C/C++]
Permalink

C++でスレッドIDを取得する方法を紹介します。

1.問題点

C++11で実装されたstd::threadを使ったプログラムを作ってみました。

sample.cpp

#include <cstdlib>
#include <iostream>
#include <thread>
 
void task1(const std::string msg) {
    std::cout << "task1:" << msg << std::endl;
}
 
void task2(const std::string msg) {
    std::cout << "task2:" << msg << std::endl;
}
 
int main(int argc, char **argv) {
    std::thread t1(task1, "Hello World!!");
    std::thread t2(task2, "Hello World!!");
    t1.join();
    t2.join();
    return 0;
}

このプログラムで、各スレッドのスレッドIDを調べたいのですが方法が分かりません。

ということで、C++でスレッドIDを取得する方法を紹介します。

2.スレッドIDを取得する

スレッドIDを取得するには、task1()およびtask2()にstd::this_thread::get_id()を追加します。

...(略)...
void task1(const std::string msg) {
    std::cout << "task1:" << msg << std::endl;
    std::cout << "task1 thread:" << std::this_thread::get_id() << std::endl;
}
 
void task2(const std::string msg) {
    std::cout << "task2:" << msg << std::endl;
    std::cout << "task2 thread:" << std::this_thread::get_id() << std::endl;
}
...(略)... 

実行結果(実行結果はスレッド動作に依存します)

% ./a.out
task2:Hello World!!
task1:Hello World!!
task2 thread:140031416473344
task1 thread:140031424866048

main()で各スレッドのスレッドIDを取得したい場合は、次のようにします。

...(略)...
int main(int argc, char **argv) {
    std::thread t1(task1, "Hello World!!");
    std::thread t2(task2, "Hello World!!");
    std::cout << "main thread:" << std::this_thread::get_id() << std::endl;
    std::cout << "t1 thread:" << t1.get_id() << std::endl;
    std::cout << "t2 thread:" << t2.get_id() << std::endl;
    t1.join();
    t2.join();
    return 0;
}

実行結果(実行結果はスレッド動作に依存します)

% ./a.out
main thread:140046616794944
task2:Hello World!!
task1:Hello World!!
t1 thread:140046599993088
t2 thread:140046591600384

上の例では直接出力しましたが、スレッドIDを変数に代入する場合は次のように記述します。

自分のスレッドIDを変数に保持

std::thread::id this_id = std::this_thread::get_id();

スレッドオブジェクトのスレッドIDを変数に保持

std::thread t1;
std::thread::id this_id = t1::get_id();

3.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages