2017年4月28日金曜日

【 Wordpress】ユーザー登録の姓名の表示順をどうするか

問題点

Wordpressの標準日本語翻訳ではFrist Name = 名、Last Name = 姓 と、『意味的』に正しい翻訳になっている。このため、ユーザプロフィールの表示・編集画面では 名(Frist Name)・姓(Last Name)の順に表示され、これを日本式に逆転する機能は用意されていないので非常に違和感がある。

解決策の検討

もっとも簡単な解決策は「気にしない」である。利用者が限られている場合は我慢してもらうことを選択肢から排除する必要はないだろう。しかし一般ユーザが登録するサイトではそうもいかない。
ネット上で多く提案されている解決策は、JavaScriptによってユーザプロフィール画面の名・姓の表示順を入れ替えるものである。また、これはプラグイン「last_name_first_name」を採用することでコードを書くことなく簡単に実現できる。

使い方は簡単で、プラグインをインストールして有効化するだけ。設定等は何もない。このプラグインはWordpress本体に関しては十分に実用的な解決策だが、姓名を扱う他のプラグインを使用するサイトでは同様の問題を解決する必要がある。

2017年4月5日水曜日

【 Excel 】シートの最後のセル(xlLastCell)をリセットする

シートの行や列を削除しても使用範囲(UsedRange)は元の範囲のままとなっており、実際の使用範囲を反映するように手動で調整するのは面倒である。
これをプログラムで行う。

Sub ResetLastCell()
' シートの xlLastCell の位置を再調整する
' 削除範囲にデータがあっても確認せずに削除するので、注意。
'【 使い方 】LastCell にしたいセルを選択して呼び出す。実行後、ブックを開き直すこと。
  Dim wCell As Range, wRet As Integer
  Dim wNewRow As Long, wNewCol As Long, wCurRow As Long, wCurCol As Long
 
  Set wCell = ActiveCell
  wRet = MsgBox( _
          wCell.Address + "を LastCell にします。" + vbCrLf  + vbCrLf + _
          "他のセルを指定するには「No」を押してください。", _
          vbYesNoCancel, "LastCell の位置を再調")
  If (wRet = vbCancel) Then GoTo ResetLastCellExit
  If (wRet = vbNo) Then
    Set wCell = Application.InputBox(Prompt:="新しい LastCell を選択してください。", Type:=8)
    If (wCell Is Nothing) Then GoTo ResetLastCellExit
    On Error GoTo 0
  End If
  wCell.Parent.Activate
  wNewRow = wCell.Row + 1:    wNewCol = wCell.Column + 1
  Set wCell = wCell.SpecialCells(xlLastCell)
  wCurRow = wCell.Row:    wCurCol = wCell.Column
  ' 削除による参照先エラーを避けるため、Cells で指定する。
  If (wCurRow > wNewRow) Then           ' 行を調整
    Range(Cells(wCurRow, wCurCol), Cells(wCurRow, wCurCol)).EntireRow.Cut Destination:=Range(Cells(wNewRow, wNewCol), Cells(wNewRow, wNewCol)).EntireRow
    Range(Cells(wNewRow, wNewCol), Cells(wCurRow, wCurCol)).EntireRow.Delete Shift:=xlUp
  End If
  If (wCurCol > wNewCol) Then           ' 列を調整
    Range(Cells(wCurRow, wCurCol), Cells(wCurRow, wCurCol)).EntireColumn.Cut Destination:=Range(Cells(wNewRow, wNewCol), Cells(wNewRow, wNewCol)).EntireColumn
    Range(Cells(wCurRow, wCurCol), Cells(wNewRow, wNewCol)).EntireColumn.Delete Shift:=xlLeft
  End If
  MsgBox "ブックを保存し、開き直してください。", vbOKOnly
ResetLastCellExit:
End Sub