Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


217 / 3841 ページ ←次へ | 前へ→

【78124】Re:セルの表示幅一杯までで文字列を切り...
発言  γ  - 16/4/16(土) 8:39 -

引用なし
パスワード
   疑問の件は、列と列の間には"遊び"があるからでしょう。

そもそもですが、Excelは清書用の道具ではないので、
余り精密なことを求めると無駄な労力が掛かることになります。
TrueTypeフォントを相手に文字の幅を求めるとかは、労多くして実り少ないです。
印刷と見た目の一致を目指すとか、も同様です。

最初に戻ると、
一行の文字数を固定して(これは試行錯誤、目の子でやってください。
少し右に余白ができても完璧は目指さないことです。)
・長い文字列を頭からその文字数単位で取り出し(Left関数で可能)、
・それをそれぞれのセルに書き込むことを繰り返す、
部分をマクロで対応するくらいでしょう。

それ以上のことを精緻にしようとしても生産性は高まらない気がします。
・ツリー全体表示

【78123】Re:セルの表示幅一杯までで文字列を切り...
発言  β  - 16/4/16(土) 8:25 -

引用なし
パスワード
   ▼いのり さん:

>挿入先のセルは、「列の幅」が1のセルが35個結合されているので、
>作業用のセルの「列の幅」を35にしてみたんですが、挿入先のセル
>よりかなり幅が小さいんです。

列の幅 は、どの数値でしょうか?
列を選択して、列幅を表示すると出てくる数値?
これは、VBAで扱うプロパティとしては ColumnWidth という、実に怪しげな(?)不確かな数値です。
標準フォントの半角の 0 が セル内に何個収まるかという数値で、
かつ、これを倍にすれば格納できる文字数も倍になるかというと
そうではなく、エクセル流に、前後に遊びの部分がはいるようです。
エクセル内部では、なんらかの基準で処理しているのでしょうから【仕様】といえば、そうなりますが、
コメントしたようにどういう基準なのかの公開が皆無です。

また、これもコメントしましたが、セルには収まっているものが、印刷すると、
末尾がきれてしまったりすることはしょっちゅう発生するわけで
画面描画と印刷の仕様にも不整合があります。

ちなみに、より正確(?)な列幅は VBAで扱うプロパティとしては、ColumnWidth ではなく Width(ポイント値)。
でも、この Width は参照できますが、設定数値として与えることはできません。
あるいは、シート上段の列記号、この右端にマウスを当て、左右矢印付の十字マークがでた状態でクリックすると
幅: 8.38(72ピクセル) といったように表示されますが、
8.38 は あてにならない ColumnWidth、72 が 確かな数値(ピクセル値)です。

いずれにしても、

>画面上に定規を当てて調べたら55.88でほぼ同じになったのですが、納得がいきません。

納得はいかないでしょうが、もともとが、あてにならない数値です。
コメントしているように、このあたりの情報開示がないことと、仮に情報開示があっても
画面描画と印刷の不整合はありますので、苦労して、こと文字列処理に関しては貧弱なエクセルを
使うこと自体が、今回の目的からいえば、【労多くして功少なし】ということだと思いますよ。
・ツリー全体表示

【78122】Re:セルの表示幅一杯までで文字列を切り...
発言  いのり  - 16/4/15(金) 16:41 -

引用なし
パスワード
   ▼きまぐれ さん:
>▼いのり さん:
>結合していない作業用セルの列巾を同じにして、両端揃え。
>分割されたデータをVBAで転記では駄目ですか。
いい方法だと思い、やろうとしてみたんですが、つまずきました。

挿入先のセルは、「列の幅」が1のセルが35個結合されているので、
作業用のセルの「列の幅」を35にしてみたんですが、挿入先のセル
よりかなり幅が小さいんです。

結合されたセルは「列の幅」が1のセル35個分なのに、結合して
いない「列の幅」35のセルの方が幅が小さいのはなぜなんでしょうね。
結合されたセル(挿入先のセル)と同じセル幅にするには、「列の幅」を
いくつに指定すればいいんでしょうか。 画面上に定規を当てて調べたら
55.88でほぼ同じになったのですが、納得がいきません。

もしかして、「列の幅」に1と入力しても、内部的には端数があって、
1.59とかになっているけれど、それを確認することも設定することも
できない・・・というような仕様なんでしょうか。
・ツリー全体表示

【78121】Re:セルの表示幅一杯までで文字列を切り...
回答  きまぐれ  - 16/4/15(金) 12:49 -

引用なし
パスワード
   ▼いのり さん:
結合していない作業用セルの列巾を同じにして、両端揃え。
分割されたデータをVBAで転記では駄目ですか。
・ツリー全体表示

【78120】Re:セルの表示幅一杯までで文字列を切り...
お礼  いのり  - 16/4/15(金) 11:56 -

引用なし
パスワード
   うーん、そうすると、事実上、今回の質問は実現できないということ
でしょうか。

残念ですが、できないのであれば仕方がありません。βさん、γさん、
きまぐれさん、ご助言ありがとうございました。

▼β さん:
>▼いのり さん:
>
>失礼します。
>
>届け出関係でどうしてもエクセル様式で提出しなければいけないということを前提にした
>文字列制御の質問、けっこう目にします。
>
>しかしながら、γさんも指摘される通り、エクセルの文字列制御は、きわめて貧弱、かつ
>我々使用者側への情報(裏の処理メソッドであったり、処理結果、文字列の長さがどうなるかであったり)
>の開示が皆無に近いです。
>
>そこを、なんとかということで四苦八苦するわけですが、膨大なコードを用意して対処するわりには
>不完全な制御しかできないようです。
>
>たとえば私の環境で セルに 半角小文字で abcdefghijllmnopqrstu といれて
>折り返して全体を表示。
>セル上では、a〜j、k〜s、tu この3行になります。
>で、これを印刷すると 2行目が k〜r、3行目が stu になります。
>
>ことほど左様にといいますか、エクセルの文字列制御はいい加減です。
>なので、苦労して、開示されていない情報を、なんとか想像しながらひねくりまわして
>文字列の長さを計算して加工しても印刷すると、必ずしもそうなっておらず、
>苦労が水の泡になる公算が少なくないです。
>
>ふと、思いついて罫線ではなくなり、かつ 最終行の線が短くなりますが、
>文字に下線を設定して、折り返して全体を表示してみました。
>でも、↑でコメントした通り、文字そのものがセルの表示と印刷結果で異なっています。
・ツリー全体表示

【78119】Re:セルの表示幅一杯までで文字列を切り...
発言  いのり  - 16/4/15(金) 11:48 -

引用なし
パスワード
   ▼きまぐれ さん:
>ホームタブのフィル→両端揃えの機能が使えませんか。
まさにこのような動作を実現したいんですが、残念ながら、
実は挿入先のセルは、文書の様式の都合上、結合されたセル
なのです。下にあるセルと同じように結合されているのですが、
結合されたセルに対しては「両端揃え」は実行できないようです。
「結合されたセルの一部を変更することはできません。」のエラー
になってしまいます。

もし、結合されたセルに対しても、このコマンドが使えるなら、
ばっちりなのですが・・・。
・ツリー全体表示

【78118】Re:セルの表示幅一杯までで文字列を切り...
回答  きまぐれ  - 16/4/15(金) 9:00 -

引用なし
パスワード
   ▼いのり さん:

ホームタブのフィル→両端揃えの機能が使えませんか。

文字列が全て全角の場合はいいですが、半角混ざりの場合は、
不自然なところで分割されます。
フォントがプロポーショナルだと比較的ましです。
全て半角では機能しません。

見栄え重視なら、全て全角にし、等幅フォント使用。


何行に分割されるかわからず、下方に上書きされるので
作業エリアで確認してからして下さい。
・ツリー全体表示

【78117】Re:セルの表示幅一杯までで文字列を切り...
発言  β  - 16/4/15(金) 8:30 -

引用なし
パスワード
   ▼いのり さん:

失礼します。

届け出関係でどうしてもエクセル様式で提出しなければいけないということを前提にした
文字列制御の質問、けっこう目にします。

しかしながら、γさんも指摘される通り、エクセルの文字列制御は、きわめて貧弱、かつ
我々使用者側への情報(裏の処理メソッドであったり、処理結果、文字列の長さがどうなるかであったり)
の開示が皆無に近いです。

そこを、なんとかということで四苦八苦するわけですが、膨大なコードを用意して対処するわりには
不完全な制御しかできないようです。

たとえば私の環境で セルに 半角小文字で abcdefghijllmnopqrstu といれて
折り返して全体を表示。
セル上では、a〜j、k〜s、tu この3行になります。
で、これを印刷すると 2行目が k〜r、3行目が stu になります。

ことほど左様にといいますか、エクセルの文字列制御はいい加減です。
なので、苦労して、開示されていない情報を、なんとか想像しながらひねくりまわして
文字列の長さを計算して加工しても印刷すると、必ずしもそうなっておらず、
苦労が水の泡になる公算が少なくないです。

ふと、思いついて罫線ではなくなり、かつ 最終行の線が短くなりますが、
文字に下線を設定して、折り返して全体を表示してみました。
でも、↑でコメントした通り、文字そのものがセルの表示と印刷結果で異なっています。
・ツリー全体表示

【78116】Re:セルの表示幅一杯までで文字列を切り...
発言  いのり  - 16/4/15(金) 8:03 -

引用なし
パスワード
   > 何かお役所かどこかに提出するものが、そんなとんでもないものになっているとか、
>でしょうか?
おっしゃる通り、提出する様式なんです。

>それと、Excelは文章を適切な領域に配置することは得意ではありません。
>どうやらWordを使って作成した方がいいような話のようにも見受けます。
>いかがですか?
残念ながら Excel の様式で作成しないといけないんですよ。提出用の様式は
決まっているので勝手に Word でそっくりな様式を作るわけにはいかなくて
やはりなんとか Excel で実現したいのですが・・・。毎回手作業で文章を
分けて入力するのはかなり手間なので自動化したいと考えてます。
・ツリー全体表示

【78115】Re:セルの表示幅一杯までで文字列を切り...
発言  γ  - 16/4/14(木) 21:16 -

引用なし
パスワード
   それは結構無駄な作業になるんじゃないですか?
挿入、削除があったら、根本から直さないといけないですし。
それに意味的につながっているものなので、
間に罫線がないほうが自然じゃないかと思うのですが、いかがですか?

何かお役所かどこかに提出するものが、そんなとんでもないものになっているとか、
でしょうか?

それと、Excelは文章を適切な領域に配置することは得意ではありません。
どうやらWordを使って作成した方がいいような話のようにも見受けます。
いかがですか?

# 言われたとおりのコードを出すことが、必ずしも適切な回答ではないと、
# 考えます。
# 気に入らなければ、スキップしてください。
・ツリー全体表示

【78114】セルの表示幅一杯までで文字列を切り分け...
質問  いのり  - 16/4/14(木) 16:48 -

引用なし
パスワード
   excel 2007 の vba で、あるテーブルに入力された文字列を、印刷用のシートAのセルに流し込み表示させようとしています。

テーブルに入力された文字列が、シートAのセルAの幅には入りきらない場合、セルAにはぎりぎり一杯入るまでの文字列を挿入し、次の行(セルB)に、続きの文字列を挿入(せるBにも入りきらない場合、さらに次の行(セルC)に、セルBの続きの文字列を挿入)して、テーブルに入力された文字列がセルA、B、C・・・に改行されて表示されているかのように見えるように表示させたいのです。


テーブルAの文字列(例)="これは長い長い文字列です。1つのセルの表示幅からはみ出てしまいます。"

(シートA)
--------------------------------
|   |これは長い長い|    |
--------------------------------
|   |文字列です。1|    |
--------------------------------
|   |つのセルの表示|    |
--------------------------------
|   |幅からはみ出て|    |
--------------------------------
|   |しまいます。 |    |
--------------------------------
このように、セルに表示できる一杯までの文字列を挿入して、続きは次の行のセルに挿入するようにしたい。


なんでこんなことをするかというと、セルの設定で「折り返して全体を表示」にして1つのセルだけで折り返し表示させた場合、折り返して表示される行の間に罫線を表示させることができないからです。なので、セルA、B、C・・・の間に指定したい罫線を設定したシートAを使おうとしています。

シートAのセルA、B、C・・・の表示幅一杯で文字列を切り分けて(分割して)セルA、B、C・・・に順に挿入するには、どのようにしたらよいのでしょうか。
・ツリー全体表示

【78113】Re:教えて下さい!
発言  γ  - 16/4/10(日) 15:13 -

引用なし
パスワード
   ひやかし半分の投稿はおやめください。
コメント発言があったら返事をするものです。
・ツリー全体表示

【78112】Re:教えて下さい!
発言  γ  - 16/4/7(木) 0:05 -

引用なし
パスワード
   数字だけを取り出したいとのことですが、
Webクエリーでデータを取り出してはどうですか?
ワークシートに取り込めれば、
あとはいくらでも好きなように加工できるはずです。

手作業でしたくないんです、との声が聞こえるようですが、
マクロ記録して、マクロに仕立てることも簡単にできるはずです。

DOMの利用とか、XMLHTTPオブジェクトを操作して正規表現で取り出す
といった方法もあるでしょうけど、
簡単なことは簡単にすませるのがよいと思いますよ。
・ツリー全体表示

【78111】Re:教えて下さい!
発言  亀マスター  - 16/4/6(水) 19:04 -

引用なし
パスワード
   質問が抽象的すぎて、これではなかなか回答がつかないと思いますよ。

現状、あなたがどこまで出来るのか、具体的にどこでつまずいているのかを
示してはどうでしょう。
例)
・ウェブからXMLHTTPを取得する方法がわからない
・取得したXMLから文字列を抜き出す方法がわからない
・文字列を解析してテーブル部分を取り出す方法がわからない

何もわからず、完成品のようなVBAのコードを提示して欲しいというのであれば、
それはこのサイトの方針からはずれていますし、何より、そんなことに対して
回答をくれる人はいないかと思います。
・ツリー全体表示

【78110】教えて下さい!
質問  高橋  - 16/4/6(水) 9:35 -

引用なし
パスワード
   XMLHTTPオブジェクトで、ホームページにある下の様なテーブルから
数字データのみを取り出して、エクセルのB列2行目から下方向に取り込む様にしたいのですが、VBAを理解されている方、どの様にマクロを記述すればよいのか、ご教授いただけませんでしょうか。

エクセルのB列が
1 タイトル
2 542.88
3 628.58
4 485.25

となるようにしたいです。


<table>
<tr height=18 style='mso-height-source:userset;height:13.5pt'>
 <td height=18 class=xl155864 width=72 style='height:13.5pt;width:54pt'>山田</td>
 <td class=xl635864 align=right width=74 style='width:56pt'>542.88</td>
</tr>
<tr height=18 style='mso-height-source:userset;height:13.5pt'>
 <td height=18 class=xl155864 style='height:13.5pt'>須賀</td>
 <td class=xl635864 align=right>628.58</td>
</tr>
<tr height=18 style='mso-height-source:userset;height:13.5pt'>
 <td height=18 class=xl155864 style='height:13.5pt'>石川</td>
 <td class=xl635864 align=right>485.25</td>
</tr>
</tr>
</table>

何卒、何卒よろしくお願いいたします。
・ツリー全体表示

【78109】Re:アクティブ行の列を選択してセルの色...
お礼  HIRO  - 16/4/5(火) 13:27 -

引用なし
パスワード
   ▼β さん:
ありがとうございます!

迅速にご対応いただいたのに
確認が遅くなって非常に申し訳ありませんでした。

見事に成功しました!

シートに書かれているコードで、標準モジュールではなかったので
苦心していたところでした。
セル領域にシート修飾(ピリオド)をつけるという技に感動しました。
本当にありがとうございます。
そしてわかりやすい解説も付けていただき、感激しました。

まだまだ勉強が足りないな、と心から思いました。
今後とも何かあればご教示いただけますと幸甚です!

ありがとうございました。

>▼HIRO さん:
>
>少しお先走ることになるかもしれませんが。
>
>もし、このコードが Sheets(ShName) ではないシートのシートモジュールに書かれていた場合は
>Range(Cells(gyou, 59),Cells(gyou,60)).Select 
>このコードで、1004エラー RangeクラスのSelectメソッドが失敗しましたよいうエラーになります。
>
>Sheets(ShName).Activate
>
>これで、確実に Sheets(ShName) がアクティブシートになります。
>
>gyou = ActiveCell.Row
>
>ActiveCell はブックに1つしかありません。今アクティブになっているシートのアクティブになっているセルです。
>ですから、このコードも、確実に Sheets(ShName) のアクティブセルを参照します。
>
>問題はそのあと。
>
>Range(Cells(gyou, 59),Cells(gyou,60)).Select 
>
>セル領域に どのシートなのかという情報を明示しない場合、
>・標準モジュールなら、今、アクティブになっているシート とみなされます。
> で、このコードは問題なくOKになるはずです。
>・シートモジュールの場合は、そのコードが書かれたシートということになります。
> そのコードが書かれたシートが Sheets(ShName) ではなかった場合、
>  Range(Cells(gyou, 59),Cells(gyou,60)) という領域は、今アクティブになっていないシートの領域になります。
> アクティブではないシートの領域は Select できません。なので、Select仕様とすると、
> それはエクセルのルールに反している!! と叱られます。
>
>対応策は2つ。
>
>1.このコードを標準モジュールに書く。
>2.シートモジュールであれば
>
>  With Sheets(ShName)
>    .Activate   'これはActiveCell取得のためやむなし
>    gyou = ActiveCell.Row
>    'セル領域にシート修飾(ピリオド)をつける    
>    .Range(.Cells(gyou, 59), .Cells(gyou, 60)).Interior.ColorIndex = 10
>  End With
・ツリー全体表示

【78108】Re:アクティブ行の列を選択してセルの色...
発言  β  - 16/4/4(月) 20:47 -

引用なし
パスワード
   ▼HIRO さん:

少しお先走ることになるかもしれませんが。

もし、このコードが Sheets(ShName) ではないシートのシートモジュールに書かれていた場合は
Range(Cells(gyou, 59),Cells(gyou,60)).Select 
このコードで、1004エラー RangeクラスのSelectメソッドが失敗しましたよいうエラーになります。

Sheets(ShName).Activate

これで、確実に Sheets(ShName) がアクティブシートになります。

gyou = ActiveCell.Row

ActiveCell はブックに1つしかありません。今アクティブになっているシートのアクティブになっているセルです。
ですから、このコードも、確実に Sheets(ShName) のアクティブセルを参照します。

問題はそのあと。

Range(Cells(gyou, 59),Cells(gyou,60)).Select 

セル領域に どのシートなのかという情報を明示しない場合、
・標準モジュールなら、今、アクティブになっているシート とみなされます。
 で、このコードは問題なくOKになるはずです。
・シートモジュールの場合は、そのコードが書かれたシートということになります。
 そのコードが書かれたシートが Sheets(ShName) ではなかった場合、
 Range(Cells(gyou, 59),Cells(gyou,60)) という領域は、今アクティブになっていないシートの領域になります。
 アクティブではないシートの領域は Select できません。なので、Select仕様とすると、
 それはエクセルのルールに反している!! と叱られます。

対応策は2つ。

1.このコードを標準モジュールに書く。
2.シートモジュールであれば

  With Sheets(ShName)
    .Activate   'これはActiveCell取得のためやむなし
    gyou = ActiveCell.Row
    'セル領域にシート修飾(ピリオド)をつける    
    .Range(.Cells(gyou, 59), .Cells(gyou, 60)).Interior.ColorIndex = 10
  End With
・ツリー全体表示

【78107】Re:アクティブ行の列を選択してセルの色...
回答  マリオ  - 16/4/4(月) 20:44 -

引用なし
パスワード
   これだと、どうでしょうか?エラーになりますか?

  Dim sh As Worksheet
  Set sh=Sheets(ShName)
  sh.Activate
  Dim gyou As Long
  gyou = ActiveCell.Row
  
  'アクティブシート名を確認
  Debug.Print Activeheet.Name
  
  '念のためもう一度、
  sh.Activate
  
  '★Cellsの前もシートを指定する
  sh.Range(sh.Cells(gyou, 59),sh.Cells(gyou,60)).Select
  
  Selection.Interior.ColorIndex = 10
・ツリー全体表示

【78106】Re:アクティブ行の列を選択してセルの色...
発言  β  - 16/4/4(月) 19:56 -

引用なし
パスワード
   ▼HIRO さん:

もう1つ。
このコードはどこに書かれていますか?

標準モジュールですか?
シートモジュールですか?
・ツリー全体表示

【78105】Re:アクティブ行の列を選択してセルの色...
発言  β  - 16/4/4(月) 19:21 -

引用なし
パスワード
   ▼HIRO さん:

この処理を行うためにシートをActivateしたり、セルをSelectしたりしないでも
できますし、そうしないのが基本ですけど、それはそれとして。

エラー のエラー番号とメッセージは、どういうものでしたか?
・ツリー全体表示

217 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free