Excel総合相談所 32

このエントリーをはてなブックマークに追加
425名無しさん@そうだ選挙にいこう:2005/04/12(火) 17:08:24
>>424
とりあえず番地(アラビア数字)以降を右に分けるなら

Sub 数字以降を右に移動()
 Dim hoge As String, i As Byte
 hoge = ActiveCell.Value
 Do
  i = i + 1
 Loop Until Mid(hoge, i, 1) Like "#"
 ActiveCell.Value = Left(hoge, i - 1)
 ActiveCell.Offset(0, 1).Value = Right(hoge, Len(hoge) - i + 1)
End Sub


下3行を
 ActiveCell.Offset(0, 1).Value = Left(hoge, i - 1)
 ActiveCell.Offset(0, 2).Value = Right(hoge, Len(hoge) - i + 1)
End Sub
とすれば、元の住所はそのままで、対象セルの1つ右に番地の前、2つ右に番地を振り分けられる。

市区町村名に"市・区・町・村"の文字がある場合に区切り位置がおかしくなることを承知してくれるなら
"市・区・町・村"の文字位置で分割するマクロくらい書いてもいいけど。
全て手動でやるよりはマクロで処理した後、修正した方が早いだろ。
もし欲しかったらデータの範囲を書いてくれ。
426402:2005/04/12(火) 17:55:23
>>425さん
わあ、ありがとうございます。
一個のセル、番地前後で分離できました。
ぶっ飛ばされそうなんですけど、列全体を指定する時は
どのようにしてかくんですか?activerow?
427名無しさん@そうだ選挙にいこう:2005/04/12(火) 18:11:15
>>426
Sub 数字以降を右に移動()
 Dim hoge As String, i As Byte, r As Long
 Const c As Byte = 1 '列番号を指定
 For r = 1 To Cells(65536, c).End(xlUp).Row
  i = 0
  hoge = Cells(r, c).Value
  Do
   i = i + 1
  Loop Until Mid(hoge, i, 1) Like "#"
  Cells(r, c).Value = Left(hoge, i - 1)
  Cells(r, c + 1).Value = Right(hoge, Len(hoge) - i + 1)
 Next r
End Sub

列番号は1ならA列、2ならB列、
開始行が1行目からじゃないなら「For r = 1〜」の1を書き換え。
んで、元データそのままで処理するには
  Cells(r, c + 1).Value = Left(hoge, i - 1)
  Cells(r, c + 2).Value = Right(hoge, Len(hoge) - i + 1)
でよろしく。
428名無しさん@そうだ選挙にいこう:2005/04/12(火) 18:57:52
住所を県市区町村などで分けたいというのは時々あるけど、
八日市場市とか十日町市とか市川市市川とか今市市今市とかあるので、
データベースを参照しながらじゃないと無理でしょう。
429名無しさん@そうだ選挙にいこう:2005/04/12(火) 19:00:28
>>428
既にその件は>>404で書かれてる。
430402:2005/04/12(火) 19:17:03
>>427さん
ほんとにあほ丸だしですみません。
列指定してできました。700件くらいのデータなんですが、
オーバーフローといって50件目で止まってしまいます。
これは50件ごとにマクロをしていくしかないのでしょうか。
お時間あったら教えてください。
431名無しさん@そうだ選挙にいこう:2005/04/12(火) 19:25:06
>>430
50件の制限というわけではなく、
数字のない住所の位置でオーバーフローしますね。
i = i + 1
の下の行に
If i > Len(hoge) Then Exit Do
を入れてみてください。

これでダメなら止まってしまう位置の住所を貼ってみて。
432402:2005/04/12(火) 19:28:27
>>431さん
早速のご回答ありがとうございます。
できました!これで、郵便番号がふれます…。

ここの方たちみなさんに感謝します。
また教えてくださいね。
433名無しさん@そうだ選挙にいこう:2005/04/12(火) 19:34:43
>>432
Do
 i = i + 1
Loop Until Mid(hoge, i, 1) Like "#" Or i > Len(hoge)

もう見てないかもしてないけどこれの方が良かったかも。
結果は同じはずだけど、こっちの方がちょっと処理早いかな。
434名無しさん@そうだ選挙にいこう:2005/04/12(火) 19:36:33
ついでに気が向いたら、最初に
Application.ScreenUpdating = False
最後に
Application.ScreenUpdating = True
を入れておくとより処理が早くなる。
435402:2005/04/12(火) 19:37:33
>>433>>434
みてます!
そちらに変更します。
ありがとうございました。
436名無しさん@そうだ選挙にいこう:2005/04/12(火) 23:11:58
>>423
406じゃないけど、ググって作ってみた。
自信は無いけどどうだろう?
文字を取り出してもテーブルの区切りがわからんので、
スペースがセルの中にあると思った結果にならない。
MSFormsを参照してるのと、
クリップボードの形式を事前に調べてはいない。

Dim cc As New MSForms.DataObject
Dim s, t
Dim i As Integer
Dim j As Integer

cc.GetFromClipboard
s = Split(cc.GetText(1), vbCrLf)
For i = 0 To UBound(s)
t = Split(s(i))
For j = 0 To UBound(t)
ActiveCell(i + 1, j + 1) = t(j)
Next j
Next i
437名無しさん@そうだ選挙にいこう:2005/04/12(火) 23:15:00
----------------------------------------------------
ここまで読んだ。ここまで読んだ。ここまで読んだ。ここまで読
----------------------------------------------------
Dim oHttp As Object
Dim s
Dim i
Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET", "http://www.yahoo.co.jp", False
oHttp.Send
s = Split(oHttp.responseText, vbCrLf)
For i = 0 To UBound(s)
Cells(i + 1, 1) = s(i)
Next i
----------------------------------------------------
んだ。ここまで読んだ。ここまで読んだ。ここまで読んだ。ここま
----------------------------------------------------
438名無しさん@そうだ選挙にいこう:2005/04/13(水) 04:42:27
前スレで質問しましたが、誰も知ってる方がいなかったので、再度質問させてください。

他人に貰ったエクセルファイルを加工してます。
問題は、下のような邪魔なボタンがあります。どうやって消せばいいのでしょうか?
http://up.nm78.com/data/up091070.jpg
439405:2005/04/13(水) 07:36:20
>>436
また情報後出しとか言われそうだけど、自分が以前書いたマクロです。
Dim myData As New DataObject
Dim w As Variant, i As Integer

myData.GetFromClipboard
w = Split(myData.GetText, vbCrLf)
For i = 0 To UBound(w) - 1
Range(ActiveCell.Offset(i, 0), ActiveCell.Offset(i, UBound(Split(w(i))))) = Split(w(i))
Next i
>>436と同じような物ですが、>>414でも書いた通りDataオブジェクトを使って
クリップボードの値を取得すると繋がった文字列になってしまいます。
区切り位置に半角スペースが入るのでそこで分割しただけだけど、
自分がコピーしたい表には半角スペースが含まれないことの方が希なので全く使い物になりませんでした。

>>423の言うとおり、速度面の問題もあるのでなんとか
「VBAからHTMLDocumentオブジェクトを使って、HTMLテーブルセルの値を直接Excelのセルに書きこむ方法」
を実現したいのですが、コピーしたhtmlデータをどうやってテーブル区切りで取得させるかが全く解らない状況です。
440名無しさん@そうだ選挙にいこう:2005/04/13(水) 07:40:48
かなり頻繁に検索を使うのですが、グーグルの検索ツールバーのようにツールバーに検索窓を追加
するようなことは出来るのでしょうか?
441405:2005/04/13(水) 08:16:05
>>440
田中亨に検索ツールバーのアドインがあるので使ってみては?
ttp://www.officetanaka.net/library/

リンクフリーなのでスクリーンショットも貼っておく
ttp://www.officetanaka.net/library/sample/tbf-1.jpg
ttp://www.officetanaka.net/library/sample/tbf-2.jpg
SSでは単体になってるけど、もちろんツールバーに埋め込むことも出来る。
442名無しさん@そうだ選挙にいこう:2005/04/13(水) 10:02:54
>>441
おお。ありがとー。
443406:2005/04/13(水) 15:02:00
>>439
405さんに質問です。
コピー元(HTML)のセルは1つのテーブル<table>〜</table>全体ですか?
それともテーブルの中の一部分のセルですか?

前者であれば表示中のHTMLDocumentからtableエレメントオブジェクトを特定し、
Rows(i)Cells(j).innerTextでエクセルライクに値を取得できますが、
後者だとdocument.selection.createRange().htmlText等で
選択範囲のHTML文字列を取得し、<tr><td>タグを解析して縦横の値を
自力で取り出す必要があるかと。

なお、これらの方法ではクリップボードは不用です。
いずれにしてもコピー元のHTMLの構造が一定であればプログラミング可能ですが、
不特定のHTMLのテーブルセル文字列を汎用的にExcelの選択セル等に埋め込むような
ルーチンを作るのはかなり大変だと思いますです。
444405:2005/04/13(水) 15:42:14
>>443
テーブルの中の一部分のセルです。
Webブラウザから表の一部をコピーしたあと、どのようにすれば良いのでしょうか?
VBAは初歩的なことしか解らないので>>443の解説だけでは
無能な自分には全く理解出来ません。
ローカルのhtmlから表全体を取得するならなんとかなるけど
いちいちローカルに保存するくらいなら、今までの方法の方が早いし。

コードを書いていただけるとありがたいのですが、
失礼ながら406氏も具体的なコードは書けないというなら、ここで期待して待つのはやめて、
何とか出来るところまで足掻いてみます。最後にはあきらめることになるだろうけど・・・
445名無しさん@そうだ選挙にいこう:2005/04/13(水) 15:51:47
WindowsXp・Excel2003ですが
新規のシートの状態から29行、E列ぐらいでセルを埋めて表を作ったんですが
そのまま普通に印刷すると29行目ぐらいがA4の真ん中ぐらいになるのですが
これの縦横をA4の用紙にいっぱいに自動で合わせて印刷するには
どう操作すればよいでしょうか?
446名無しさん@そうだ選挙にいこう:2005/04/13(水) 15:51:52
>>444
具体的にURLとどの部分をコピーしたいのか書いたほうが早いと思うよ。
447405:2005/04/13(水) 15:59:22
>>446
Webページから表をコピペしたいことが多いというだけで、
利用するサイト、ページは特に決まってません。
でも、ExcelにHTML張り付けした場合はどの表でもWebブラウザの表示と同じになるので
ソースの記述が多少違っても、1つで可能なら理論上は全てに通ずるはずですよね。
ExcelにHTML張り付けしても崩れるようなものは例外かもしれないけど。
448名無しさん@そうだ選挙にいこう:2005/04/13(水) 16:00:12
お伺いしたいのですがEXCELのシート数の制限は何枚でしょうか?
ある競技の集計ソフトを作成中でVBAで成績速報を新規シートで出力していますが
種目が多く枚数が増えるため速報のシートが31枚以上は追加出来ません
本体のシートは参照データベースや入力シート等で既に59枚あります
一度保存し再度ブックを立ち上げるとリセットされる見たいですが
私が運用するのではなく競技大会のの運営者が使用するので
なるべくトラブルを回避したいと思い質問させて頂きます
OS WindowsXP HOME
Microsoft Office Excel 2003です
449名無しさん@そうだ選挙にいこう:2005/04/13(水) 16:08:24
>>448
物理メモリ容量、及びシート内容依存です。
シートが追加できないなら、それがおそらくあなたの環境でのシート数限界です。
450名無しさん@そうだ選挙にいこう:2005/04/13(水) 16:13:19
>>449
ご回答有り難うございます
うっかりしていましたメモリ512Mです

>物理メモリ容量、及びシート内容依存です。
判りました対策を考えます
451名無しさん@そうだ選挙にいこう:2005/04/13(水) 16:19:23
VBAの質問です。
For i = 10 To 1 Step -1
 For j = 1 To 10
  If Cells(i, j).Value = hoge Then
   処理
   Exit For A
  End If
 Next j
 @
Next i

このようにForを2段使っていて、ある条件を満たしたら何らかの処理をして
Forを抜けたい場合、上のコードだとFor jは抜けられるけどFor iは抜けられませんよね。
この場合、Gotoを使ったりこのFor文以降の処理を別プロシージャにしたり@の部分にコードを入れたりせず、
Forの2段目のIf文内(Aの位置)だけのコードでFor iを抜けるにはどうすれば良いでしょうか?

実用上困ってるというわけではなく、興味があっただけなのですが、
何か方法があるなら知っておきたいのでご存じの方が居りましたらご教授ください。
452名無しさん@そうだ選挙にいこう:2005/04/13(水) 16:24:22
>>451
ねえよ。
453名無しさん@そうだ選挙にいこう:2005/04/13(水) 17:46:33
>>451
go to じゃ不都合でもあるのか?
454名無しさん@そうだ選挙にいこう:2005/04/13(水) 17:53:15
>453
「実用上困ってるというわけではなく」
って書いてあるぢゃん
ちゃんと嫁よw

なぜgoto以外の方法が知りたいのかはわからんが
455名無しさん@そうだ選挙にいこう:2005/04/13(水) 18:10:56
>>451
ダイクストラ先生におこられろ
456名無しさん@そうだ選挙にいこう:2005/04/13(水) 18:15:16
>>447
Excelのクリップボードの内容って、
Webページを入れた場合も、テキスト入れた場合も同じじゃない?
457名無しさん@そうだ選挙にいこう:2005/04/13(水) 18:40:21
>456
をいをい・・・
同じだったらhtml形式での張り付けすら出来ないだろ
つーか「Excelのクリップボード」って何よ?
クリップボードは全ソフト共通ですが、何か?
奴も言ってる通りDataObjectで取得した場合はテキスト扱いになるけどな
458名無しさん@そうだ選挙にいこう:2005/04/13(水) 18:49:01
>>451
その部分をFunctionに記述してExitするぐらいかな。
そうするメリットは感じられないが。
459名無しさん@そうだ選挙にいこう:2005/04/13(水) 18:55:36
>>457
Excelはhtml、xmlで処理してなかったっけ?
htmlのソースコードをExcelに貼り付けてみて。
460名無しさん@そうだ選挙にいこう:2005/04/13(水) 21:50:57
関数の質問です。OSはXPでエクセルは2003です。
質問の内容ですが・・
   A      B      C      D      E
1 SH900i  ドコモ    999
2 902SH   ボータ    223
3 W31SA   au     582
4   ・      ・
5   ・      ・
このような形でA・B・C列に400行データが入っています。
Aが商品名でBがメーカーでCが販売数となっています。これをD・E・F行
にTOP10だけ出したいのですが、対応出来る関数はありますでしょうか?
   D     E     F
1 ドコモ   SH900  999
2 ドコモ   D900   870
3 ドコモ   N900   825
・  ・      ・    ・
11 ボーダ   902SH  999
12 ボーダ   802SE  650
13 ボーダ   603SH  540
・  ・      ・    ・
21 au    w31SA  920
22 au    w21H   650
23 au     ・     ・
みたいな感じにしたいのです
 
461名無しさん@そうだ選挙にいこう:2005/04/13(水) 23:32:20
体重測定のExcelをつくりたいと思っているのですが

流れ的には
-------------------------------------
        4月  5月  6月 〜
スズキイチロウ 55kg  57kg  54kg
ヤマダハナコ  44kg  45kg  42kg
タナカタロウ  32kg  30kg  36kg
-------------------------------------
というデータを作成して、
200名分くらいをA5の紙に一人一人グラフで
出力するという感じで考えているんですけれど、

Sheet1部分がデータベース部分
Sheet2にグラフを表示、印刷部分

という風に考えたのですが、
どうもあきらかにSheet2の部分が能率的ではなさすぎるなあという感じです。
マクロとかがよくわからないので、下地は地道にコピペでつくるという(泣)感じなのですが。

こういうものをつくろうとした時に参考になりそうなページはございませんでしょうか?
またこれをすっきりさせるためにはどういう方法がありますか?
462名無しさん@そうだ選挙にいこう:2005/04/13(水) 23:49:17
> こういうものをつくろうとした時に参考になりそうなページはございませんでしょうか?
ヘルプ
463名無しさん@そうだ選挙にいこう:2005/04/13(水) 23:54:54
>>438
前スレ950までしか見てないんだけど、
デザインモードは試したの?
464名無しさん@そうだ選挙にいこう:2005/04/14(木) 00:02:51
>>463
してないにちがいない、、、
465名無しさん@そうだ選挙にいこう:2005/04/14(木) 00:21:02
>>460
Dをドコモの列: =if(B1="ドコモ",C1,"")
Eをボーダの列: =if(B1="ボーダ",C1,"")
FをAUの列: =if(B1="AU",C1,"")
として、キャリア別の台数を抜き出す。

次にRANK()関数でそれぞれのキャリア内での順位を出しておく。
(G列とかね)

最後にVLOOKUPで順位からデータの並べ替えを行なう。
この場合、同じ台数となっているデータはうまくいかない w

素直にソートを使って加工するのが早そうでつ。
(別にVBAでもいいが)
466名無しさん@そうだ選挙にいこう:2005/04/14(木) 00:25:05
エクセルはADOを使ってMDBにアクセスできるけど

ファイルメーカーのデータベースにアクセスする方法ってある?
467名無しさん@そうだ選挙にいこう:2005/04/14(木) 01:33:53
エクセルで作った表を印刷しようとすると横に長いために二枚組になってしまいます。
用紙を90度回転させて印刷すれば解決できるのですが、
回転させないでそのまま「用紙の横サイズに合わせて縮小する」みたいな
便利なコマンドってないのでしょうか?
468名無しさん@そうだ選挙にいこう:2005/04/14(木) 01:49:20
>>467
ページ設定>ページ>次の次数に合わせて印刷 横「1」×縦「1」 
469463:2005/04/14(木) 06:35:52
>>463-464
その通りでした。どうもありがとうございました。
470名無しさん@そうだ選挙にいこう:2005/04/14(木) 07:01:43
>>465
やはり、そうなってしまいますか・・現状は同じような設定をしてたもので
自分でももうちょい、VBAとかで試してみます。ありがとうございました
471名無しさん@そうだ選挙にいこう:2005/04/14(木) 08:20:45

VBAで指定セルの文字のバイト数を取得したいんですが
VBA関数のLenBでは半角文字も2バイトになってしまうし
なぜかWorksheetFunction.LenB()も使えない。
作業セルを設けて.Formula = "=LenB()"とやるのではなく
VBAコードのみで文字列のバイト数を求めるにはどぷすればいいでしょうか?
Excel97〜2002まで使える方法を教えてください。
472名無しさん@そうだ選挙にいこう:2005/04/14(木) 09:46:09
>>471
StrConvを使うといけますよ。
473471:2005/04/14(木) 09:58:43
>>472
LenB(StrConv(Cells(1, 1).Value, vbFromUnicode))
でバッチリいけました。ありがとうございます。
474名無しさん@そうだ選挙にいこう
エクセルのエンコードはどこで指定したらよいのでしょうか。